UVA - 10891(区间dp)

放假回来了,在家咸鱼了一周.........不会区间dp,今天下午做个区间dp专题试试

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=100+10;
int a[maxn],sum[maxn],dp[maxn][maxn];
bool vis[maxn][maxn];
int n;
const int inf=-0x3f3f3f3f;
int d(int l,int r)
{
    if(l>r) return 0;
    if(vis[l][r]) return dp[l][r];
    vis[l][r]=1;
    int mm=inf,sum1=0,sum2=0;
    for(int i=l; i<=r; i++)
    {
        sum1+=a[i];
        mm=max(mm,sum1-d(i+1,r));//寻找差值最大
    }
    for(int i=r; i>=l; i--)
    {
        sum2+=a[i];
        mm=max(mm,sum2-d(l,i-1));
    }
    return dp[l][r]=mm;
}
int main()
{
    while(~scanf("%d",&n)&&n)
    {
        memset(sum,0,sizeof(sum));
        memset(vis,0,sizeof(vis));
        for(int i=1; i<=n; i++)
        {
            scanf("%d",&a[i]);
            sum[i]=sum[i-1]+a[i];
        }
        printf("%d\n",d(1,n));

    }
    return 0;
}

 

posted on 2017-08-14 14:08  发牌员  阅读(117)  评论(0)    收藏  举报

导航