SRM 563 500pts SpellCards

SpellCards

 题意:

  有n张符卡排成一个队列,每张符卡有两个属性,等级li和伤害di。 两种操作: 1、把队首的符卡移动到队尾;2、使用队首的符卡,对敌人造成di点伤害,并丢弃队首的li张符卡(包括使用的符卡)。如果队列不足li张符卡那么你不能使用。 求出造成的伤害的总和的最大值。 1<=n<=50, 1<=li<=50, 1<=di<=10000。

分析:

  由于第一种操作的存在, 可以将序列认为是一个环。如果一个方案合法,满足li的和<=n即可。因为总是可以改变使用的顺序,使得方案满足。设选择的有a,b,即使a后面的l[a]个包含b,但是可以先使用b,再使用a,其他的类似。

 代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 typedef long long LL;
 4 
 5 class SpellCards{
 6 public:
 7     int f[1005];
 8     SpellCards() { memset(f, 0, sizeof(f)); }
 9     int maxDamage(vector<int>L, vector<int>D) {
10         int n = L.size();
11         for (int i=0; i<n; ++i) {
12             for (int j=n; j>=L[i]; --j) 
13                 f[j] = max(f[j], f[j - L[i]] + D[i]);
14         }
15         return f[n];
16     }
17 };

 

转载于:https://www.cnblogs.com/mjtcn/p/9770594.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值