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