hoj1005
题意可以自己上网找。
二维数组dp[i][j],i表示用了i个中继站,j表示到了第j个站点。
dis[i][j]表示i,j之间只建一个中继站的最少代价
dp[i][j]=min(dp[i][j],dp[i-1][k]+dis[k+1][j]);
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define inf 0x3f3f3f inline int read(){ int x=0,f=1,ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } int n,k; int d[205]; int dis[205][205],sum[205]; int dp[35][205]; int main(){ int num=0; n=read();k=read(); while(n!=0&&k!=0){ num++; for(int i=1;i<=n;i++) d[i]=read(),sum[i]=d[i]+sum[i-1]; for(int i=1;i<=n;i++) for(int j=i;j<=n;j++){ int mid=(i+j)>>1; dis[i][j]=sum[j]-sum[mid]-d[mid]*(j-mid); dis[i][j]+=d[mid]*(mid-i)-sum[mid-1]+sum[i-1]; } // for(int i=1;i<=n;i++) memset(dp,0x3f,sizeof(dp)); dp[0][0]=0; for(int i=1;i<=k;i++) for(int j=1;j<=n;j++) for(int h=0;h<j;h++) dp[i][j]=min(dp[i][j],dp[i-1][h]+dis[h+1][j]); printf("Chain %d\n",num); printf("Total distance sum = %d\n",dp[k][n]); n=read(),k=read(); } return 0; }