区间DP HDU 4283
t个数据
n个权值
1->n
可以入栈调整顺序
花费 第k个出来 w[i]*(k-1);
求花费最少
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 5 using namespace std; 6 #define MAXN 110 7 #define inf 100000000 8 9 int z[MAXN],sum[MAXN]; 10 int dp[MAXN][MAXN]; 11 12 int main() 13 { 14 int t,ca; 15 scanf("%d",&t); 16 ca=1; 17 18 while(t--) 19 { 20 int n,i,l,j,k; 21 scanf("%d",&n); 22 for(i=1;i<=n;i++) 23 { 24 scanf("%d",&z[i]); 25 sum[i]=sum[i-1]+z[i]; 26 } 27 memset(dp,0,sizeof(dp)); 28 for(i=1;i<=n;i++) 29 for(j=i+1;j<=n;j++) 30 dp[i][j]=inf; 31 32 for(l=2;l<=n;l++) 33 { 34 for(i=1;i<=n-l+1;i++) 35 { 36 j=i+l-1; 37 for(k=1;k<=l;k++) 列举第k个出场 i+1 i+k-1 前面出来 i+k j 后面出来 要加上前面k个出来的花费 这个人出来花费 38 { 39 dp[i][j]=min(dp[i][j],dp[i+1][i+k-1]+dp[i+k][j]+k*(sum[j]-sum[i+k-1])+z[i]*(k-1)); 40 } 41 } 42 } 43 printf("Case #%d: %d\n",ca++,dp[1][n]); 44 } 45 return 0; 46 }
posted on 2016-11-18 10:24 HelloWorld!--By-MJY 阅读(114) 评论(0) 编辑 收藏 举报