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 };