Memory: 1292K Time: 16MSLanguage: G++ Fault:(none) 一道dp水题,状态不好,居做了这么久... #include <memory.h> #include <stdio.h> #define V 315 #define P 32 int dp[V][P]; int p[V]; int d[V][V]; int main() { int v,post,mid; scanf("%d%d",&v,&post); for(int i = 1; i <= v; i++) scanf("%d",&p[i]); memset(dp,-1,sizeof(dp)); //d[i][j]纪录有第i个村子到第j个村子只有一个邮局的最少路程和 for(int i = 1; i <= v; i++){ mid = i; for(int j = i+1; j <= v; j++) if((j-i)%2) { mid = (i+j+1)/2; d[i][j] = d[i][j-1]-p[(i+j)/2]+p[j]; } else { d[i][j] = d[i][j-1] + p[j] - p[mid]; } } //dp[i][x]纪录着由1到i个村子有x个邮局最少的路程和 for(int i = 1; i <= v; i++) dp[i][1]=d[1][i]; for(int i = 2; i <= post; i++) for(int j = i; j <= v; j++) for(int k = 2; k <= j; k++) if(dp[j][i]<0 || (dp[k-1][i-1]+d[k][j]<dp[j][i])) dp[j][i]=dp[k-1][i-1]+d[k][j]; printf("%d/n",dp[v][post]); return 0; }