2 条题解
-
0
试着分析一下为什么惩罚不是 而是 ?
因为这样就预示着你最多跳过 个点。
剩下的就不说了吧。
#include<bits/stdc++.h> using namespace std; const int N=1e4+10; int a[N],b[N];double dp[N][35]; double dis(int x,int y){return sqrt((a[x]-a[y])*(a[x]-a[y])+(b[x]-b[y])*(b[x]-b[y]));} signed main() { int n;cin>>n; for(int i=1;i<=n;i++)cin>>a[i]>>b[i]; for(int i=1;i<=n;i++)for(int j=0;j<=31;j++)dp[i][j]=2e9; dp[1][0]=0; for(int i=1;i<=n;i++)for(int j=0;j<=31;j++)for(int k=1;i+k<=n&&j+k-1<=31;k++) dp[i+k][j+k-1]=min(dp[i+k][j+k-1],dp[i][j]+dis(i,i+k)); double ans=dp[n][0]; for(int i=1;i<=31;i++)ans=min(ans,dp[n][i]+(1<<i-1)); printf("%.10lf",ans); return 0; }
- 1
信息
- ID
- 8864
- 时间
- 2000ms
- 内存
- 1024MiB
- 难度
- 9
- 标签
- 递交数
- 15
- 已通过
- 4
- 上传者