http://acm.zzuli.edu.cn/problem.php?id=1739
自家学校OJ上的题。
一个区间dp和我上一篇博文写的区间dp基本上一样,
直接上状态转移方程dp[i][j]=min(dp[i][k]+dp[k][j]+a[i]*a[k]*a[j],dp[i][j]);
思路和上一篇基本一样,状态方程表达的意思也一样,具体参考上一篇。比较懒,不写了。。。。
1 #include<stdio.h> 2 #include<string.h> 3 const int N=1e7; 4 typedef long long ll; 5 int main(void) 6 { 7 int i,j,k,p,q,l; 8 int a[105]; 9 int dp[110][110]; 10 while(scanf("%d",&k)!=EOF) 11 { 12 for(i=1; i<=k; i++) 13 { 14 scanf("%d",&a[i]); 15 } 16 memset(dp,0,sizeof(dp)); 17 for(i=3; i<=k; i++) 18 { 19 for(j=i-2; j>=1; j--) 20 { 21 dp[i][j]=dp[i][i-1]+dp[i-1][j]+a[i]*a[i-1]*a[j]; 22 for(l=i-1; l>j; l--) 23 { 24 dp[i][j]=dp[i][j]<dp[i][l]+dp[l][j]+a[i]*a[l]*a[j]?dp[i][j]:dp[i][l]+dp[l][j]+a[i]*a[l]*a[j]; 25 26 } 27 } 28 } 29 printf("%d\n",dp[k][1]);//因为两端不取,所以最后端点就是k和1; 30 } 31 return 0; 32 33 34 }
时间: 2024-10-22 03:05:13