首页 > 其他 > 详细

Luogu P3004 [USACO10DEC]宝箱Treasure Chest

时间:2019-11-06 20:59:15      阅读:87      评论:0      收藏:0      [点我收藏+]

gate

区间dp+博弈论

j = i+len-1,f[i][len]表示以i为起点,长度为len(j为终点)的区间能取得的最大价值。

状态转移方程:f[i][len] = max(sum[i][j]-f[i+1][len-1],sum[i][j]-f[i][len-1])

即取左面的或者右面的。

博弈论中,双方都要取最优策略$(optimal)$,而且每一轮都可以看作先手和后手的互换。

所以dp方程同时可以表示两个人。

A的价值 = 区间总价值 - B的价值

区间和用前缀和来表示;第二位(区间长度)用滚动数组优化空间。

代码如下

技术分享图片
#include<cstdio>
#include<iostream>
#include<cmath>
#include<cstring>
#define MogeKo qwq
using namespace std;

const int maxn = 5005;
int n,a[maxn],f[maxn][2],s[maxn],ans;

int main() {
    scanf("%d",&n);
    for(int i = 1; i <= n; i++) 
        scanf("%d",&a[i]);
    for(int i = 1;i <= n;i++)
        s[i] = s[i-1]+a[i];
    if(n == 1) {
        printf("%d",a[1]);
        return 0;
    }
    for(int len = 1; len <= n; len++)
        for(int i = 1; i+len-1 <= n; i++) {
            int j = i+len-1;
            f[i][len%2] = max(s[j]-s[i-1]-f[i+1][(len-1)%2],s[j]-s[i-1]-f[i][(len-1)%2]); 
        }
    printf("%d",f[1][n%2]);
    return 0;
}
View Code

 

Luogu P3004 [USACO10DEC]宝箱Treasure Chest

原文:https://www.cnblogs.com/mogeko/p/11790031.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!