【LibreOJ】【LOJ】#6217. 扑克牌
【题意】给定一叠n张扑克牌和各自的ai,bi。每次可以从最上面拿走连续atop张并获得btop的价值,或是把top放到最底,求最大价值。
【算法】背包DP
【题解】本题最大的特点:atop的需求与牌的顺序无关,也即是说可以将拿走连续atop张视为拿走atop张,对于你连续的牌中你不想拿走的只需要找机会拿掉就可以了。
这样问题就转换为背包总空间n,每件物品空间ai,价值bi,求最大价值。
#include<cstdio> int f[1010],n,u,v; int main(){ scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d%d",&u,&v); for(int j=n;j>=u;j--)if(f[j-u]+v>f[j])f[j]=f[j-u]+v; } printf("%d",f[n]); }