【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]);
}
View Code

 

posted @ 2017-08-22 18:28  ONION_CYC  阅读(279)  评论(0编辑  收藏  举报