洛谷P3004 宝箱Treasure Chest——DP

题目:https://www.luogu.org/problemnew/show/P3004

似乎有点博弈的意思,但其实是DP;

f[i][j] 表示 i~j 的最优结果,就可以进行转移;

注意两个循环的顺序,要先算出 i+1 ,但要用之前的 j-1 ,所以一个倒序一个正序。

代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,f[5005][5005],s[5005];
int main()
{
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&s[i]);
        f[i][i]=s[i];s[i]+=s[i-1];
    }
    for(int i=n;i;i--)
        for(int j=i+1;j<=n;j++)
            f[i][j]=max(s[j]-s[i-1]-f[i+1][j],s[j]-s[i-1]-f[i][j-1]);
    printf("%d",f[1][n]);
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/Zinn/p/9174710.html