题目链接:点击打开链接
代码:
#include<bits/stdc++.h>
02.
using namespace std;
03.
//#define INF 0x3fffffff
04.
//const int N =205;
05.
//int a[N],sum[N],dp[N][N];
06.
using namespace std;
07.
const int N = 220;
08.
const int inf = 0x3f3f3f3f;
09.
int w[N];
10.
int dp[N][N];
11.
int sum[N];
12.
int main()
13.
{
14.
int n;
15.
while (~scanf("%d", &n))
16.
{
17.
sum[0] = 0;
18.
for (int i = 1; i <= n; i++)
19.
{
20.
scanf("%d", &w[i]);
21.
sum[i] = sum[i - 1] + w[i];
22.
}
23.
memset (dp, 0, sizeof(dp));
24.
for(int i=2; i<=n; i++)
25.
for(int j=1; j<i; j++)
26.
{
27.
int tmp=inf;
28.
for(int k=i-j; k<i; k++)
29.
tmp=min(tmp,dp[i-j][k]+dp[k+1][i]+sum[i]-sum[i-j-1]);
30.
dp[i-j][i]=tmp;
31.
}
32.
33.
// for (int i = n-1; i >= 1; i--)
34.
// {
35.
// for (int j = i + 1; j <= n; j++)
36.
// {
37.
// int tmp = inf;
38.
// for (int k = i; k <j&&k<=n; k++)
39.
// {
40.
// tmp = min(tmp, dp[i][k] + dp[k + 1][j] + sum[j] - sum[i - 1]);
41.
// }
42.
// dp[i][j] = tmp;
43.
// }
44.
// }
45.
printf("%d\n", dp[1][n]);
46.
}
47.
return 0;
48.
}
这里就不删除那个数字了,有点麻烦。反正就是从小的状态推大的状态,最后的那个状态是所要的结果,其实这个题在bzoj上有一个比这个难度大一点的题,另外还有好多优化的代码,我都还没有 学习,大二,加油!!!