
真是动态规划的 题型千千万 .
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 }