| 题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 需要注意 |
|---|---|---|---|---|---|
| 石子归并3 | ★☆☆☆☆ | 答案正确 | 100 | 2014/11/20 8:16:04 | 无 |
较大范围的石子归并。
参见CodeVS/1048。
| 3002.cpp代码已折叠
展开折叠内容
|
|---|
#include<cstdio>
#define INF (1<<30)
int dp[5000][5000]={},K[5000][5000]={},n,a[5000]={},sum[5000]={};
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
sum[i]=sum[i-1]+a[i];
K[i][i]=i;
}
for (int len=2;len<=n;len++)
for (int i=1;i<=n-len+1;i++)
{
int j=i+len-1;
dp[i][j]=INF;
for (int k=K[i][j-1];k<=K[i+1][j];k++)
if (dp[i][k-1]+dp[k][j]+sum[j]-sum[i-1]<dp[i][j])
{
dp[i][j]=dp[i][k-1]+dp[k][j]+sum[j]-sum[i-1];
K[i][j]=k;
}
}
printf("%d",dp[1][n]);
return 0;
}
|