题目
https://vjudge.net/problem/Gym-100543K
题意
n件商品,告诉你价格和价值,你可以买一次,另一个人可以使用魔法
魔法的效果是把你买的商品变没,让你在买一次,之前的的花费不返还
每件商品只能买一次,问能获得最大利润(利润 = 价值-花费)
思路
博弈DP 对于每件商品第一个人可以选择买或不买,第二个人可以选择用或不用魔法
要注意一点是买的顺序要按价值从小到大,即然能获得价值最大的最后买,不然被用了魔法就打不到最优策略
代码
#include <bits/stdc++.h>
using namespace std;
const int maxn = 2e5;
struct node
{
int p,v;
}a[maxn];
int dp[maxn][20];
int vis[maxn][20];
bool cmp(node a,node b)
{
return a.p < b.p;
}
int n;
int ok(int id,int k)
{
if(id == n + 1) return 0;
if(vis[id][k] == 1) return dp[id][k];
vis[id][k] = 1;
int ans;
if(k > 0) ans = min(a[id].p-a[id].v,ok(id+1,k-1)-a[id].v);
else ans = a[id].p - a[id].v;
ans = max(ans,ok(id+1,k));
return dp[id][k] = ans;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(vis,0,sizeof(vis));
int k;
scanf("%d%d",&n,&k);
for(int i = 1;i <= n;i++)
{
scanf("%d%d",&a[i].p,&a[i].v);
}
sort(a+1,a+1+n,cmp);
int ans = ok(1,k);
printf("%d\n",ans);
}
return 0;
}
本文探讨了一道关于两玩家博弈的动态规划问题,涉及商品购买与魔法使用策略,目标是最大化利润。通过按商品价值排序并递归计算最优解,展示了博弈DP的实现方法。
452

被折叠的 条评论
为什么被折叠?



