标签:
代码是参考ACdreamers敲的。
相邻石子合并,找最小代价。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 5 int a[110]; 6 int dp[110][110]; 7 int sum[110]; 8 int n; 9 10 int getmin() 11 { 12 for(int i=0;i<=n;i++) 13 dp[i][i]=0; 14 for(int v=1;v<n;v++)//v所代表的是当合并间隔为v的时候,遍历全部石子,找俩俩石子合并需要的最小代价。v的范围是[0,n-1] 15 { 16 for(int i=0;i<n-v;i++)//找[i,j]这个区间内的最小代价,当然,i的范围是[0,n-v-1]; 17 { 18 int j=i+v; 19 dp[i][j]=0xffffff; 20 int temp=sum[j]-(i>0 ? sum[i-1] : 0);//求[i,j]区间内的所有石子的和。sum[j]-sum[i]. 21 for(int k=i;k<j;k++) 22 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+temp);这 就是递推式的含义了 23 } 24 } 25 return dp[0][n-1]; 26 } 27 int main() 28 { 29 scanf ("%d",&n); 30 for(int i=0;i<n;i++) 31 scanf ("%d",&a[i]); 32 sum[0]=a[0]; 33 for(int i=1;i<=n;i++) 34 { 35 sum[i]=sum[i-1]+a[i]; 36 //printf("%d %d\n",sum[i],i); 37 } 38 printf("%d\n",getmin()); 39 return 0; 40 }
标签:
原文地址:http://www.cnblogs.com/bei-insomia/p/4556574.html