石子合并(一)

真是动态规划的  题型千千万  .  

 1 #include<stdio.h>
 2 #include<string.h>
 3 #include<math.h>
 4 #include<iostream>
 5 #include<algorithm>
 6 #include<queue>
 7 #include<vector>
 8 #include<set>
 9 #include<stack>
10 #include<string>
11 #include<sstream>
12 #include<map>
13 #include<cctype>
14 #include<limits.h>
15 using namespace std;
16 #define N 205
17 int sum[N],stone[N],dp[N][N];
18 int main()
19 {
20     int n;
21     while(scanf("%d",&n)!=EOF)
22     {
23         sum[0]=stone[0]=0;
24         for(int i=1;i<=n;i++)
25         {
26             scanf("%d",&stone[i]);
27             sum[i]=stone[i]+sum[i-1];           //   这种思想真是一种好东西   //   一维线性 搜索的时候 用这个也能节省超级多的时间  ..  
28         }
29         memset(dp,0,sizeof(dp));        //  先将 所有的  全归零  
30         for(int d=1;d<n;d++)                      //             距离   ,   确定两两相隔的 距离  
31             for(int i=1;i<=n-d;i++)     //  从  1 开始 一一确定 .  
32         {
33             int j=d+i;          //  开始 确定两个  距离的 坐标  
34             dp[i][j]=INT_MAX;           //    先 默认 距离最大   . 
35             int add=sum[j]-sum[i-1];           //  确定这两个数字  之间的 相差  的  知  
36             for(int k=i;k<j;k++)     //    两个数字  之间错的  坐标 一个个  更新确定  .
37                 dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]+add);
38         }
39         printf("%d
",dp[1][n]);
40     }
41     return 0;
42 }
原文地址:https://www.cnblogs.com/A-FM/p/5467005.html