合并石子

代码是参考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 }

 

posted on 2015-06-06 14:11  Bei_insomia  阅读(156)  评论(0编辑  收藏  举报

导航