石子合并问题--直线版 HRBUST - 1818 解题报告

版权声明:大鹏专属 https://blog.csdn.net/NCC__dapeng/article/details/88318172

开头一句话,寒假一时爽,开学火葬场。

石子合并问题,经典的区间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;
}

猜你喜欢

转载自blog.csdn.net/NCC__dapeng/article/details/88318172
今日推荐