AT_tdpc_game题解
AT-tdpc-game
传送门
题意简述
Alice 和 Bob 在玩游戏。初始时有两座山,左边的山上有
- 如果两座山都空了,游戏结束。
- 如果只有某一座山空了,取走另一座山上的最上面的物品。
- 如果两座山都没有空,选择任意一座山,并取走其最上面的物品。
假设两人都采取最优策略,请求出 Alice 能取得的物品的价值总和。
题目解析
与 AT-dp-l 类似。
设
转移,若轮到 Alice,即
否则
再考虑当
if((i+j)%2==0)
f[i][j]=max((i==n+1)?0:(f[i+1][j]+a[i]),(j==m+1)?0:(f[i][j+1]+b[j]));
else
f[i][j]=min((i==n+1)?INF:f[i+1][j],(j==m+1)?INF:f[i][j+1]);
当然,也可以将两座山拼起来,山顶朝外,注意判断一山取完的情况即可。此处不再详细说明。
具体实现
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1005;
const int INF=0x3f3f3f3f;
int n,m;
int a[N],b[N];
int f[N][N];
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i) scanf("%d",&a[i]);
for(int i=1;i<=m;++i) scanf("%d",&b[i]);
for(int i=n+1;i>=1;--i){
for(int j=m+1;j>=1;--j){
if(i==n+1&&j==m+1) continue;
if((i+j)%2==0)
f[i][j]=max((i==n+1)?0:(f[i+1][j]+a[i]),(j==m+1)?0:(f[i][j+1]+b[j]));
else
f[i][j]=min((i==n+1)?INF:f[i+1][j],(j==m+1)?INF:f[i][j+1]);
}
}
printf("%d\n",f[1][1]);
return 0;
}
完结撒花!请管理通过啦。