本文共 545 字,大约阅读时间需要 1 分钟。
题意:给你n个数,其中有两个人轮流从左边或者是右边拿k个数,现在每个都会根据最优策略使得自己拿到的数最大,现在让你输出两个人拿的数的差值。
思路:我们先把数的前缀和求出来,不论怎么拿,两个人拿的数值的差值相加肯定就是总的数的和。
任意时刻游戏状态都是原始序列的一段连续子序列,我们设dp[i][j]代表从i到j可以拿到的最大的数,
可以得到dp[i][j]=s[i-1][j]-min(dp[i+1][j],dp[i+2][j]......dp[i][i-1])
#include#include #include #include #include #include using namespace std;const int maxn=150;int a[maxn];int dp[maxn][maxn];int s[maxn];int vis[maxn][maxn];int n;int DP(int l,int r){ if(vis[l][r]) return dp[l][r]; vis[l][r]=1; int m=0; for(int k=l; k
转载地址:http://ibgsi.baihongyu.com/