开头一句话,寒假一时爽,开学火葬场。
石子合并问题,经典的区间DP问题。
可能有人不理解什么事区间DP,这里引进一篇非常不错的博客区间DP详解。
看完之后你会惊讶的发现啊,原来卡死自己的题竟然只是一道模板题。
自己寒假做的跪着也要疯狂学完。
下面给出AC代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1000+100;
const int INF=0x3f3f3f3f;
int dpi[maxn][maxn],dpx[maxn][maxn];
int sum[maxn];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
memset(dpi,INF,sizeof(dpi));
memset(dpx,-1,sizeof(dpx));
sum[0]=0;
for(int i=1; i<=n; i++)
{
scanf("%d",&sum[i]);
sum[i]=sum[i-1]+sum[i];
dpx[i][i]=0;
dpi[i][i]=0;
}
for(int len=2; len<=n; len++)
{
for(int i=1; i<=n; i++)
{
int j=i+len-1;
if(j>n) continue;
for(int k=i; k<j; k++)
{
dpi[i][j]=min(dpi[i][j],dpi[i][k]+dpi[k+1][j]+sum[j]-sum[i-1]);
dpx[i][j]=max(dpx[i][j],dpx[i][k]+dpx[k+1][j]+sum[j]-sum[i-1]);
}
}
}
printf("%d %d\n",dpi[1][n],dpx[1][n]);
}
return 0;
}