标签:hdu
题意:
长度为n个单位的map,每个单位需要时间t来走完。
每个单位可以放置一个塔。一共有三种塔,每种塔的作用不同:
1.只能攻击当前单位,每秒x点伤害(红塔)
2.攻击当前单位之后的所有单位,每秒y点伤害(绿塔)
3.使目标经过本单位之后减速,之后每单位需要的时间+z(蓝塔)
问目标受到的最多的攻击是多少
思路:
首先明确,1塔只能放在最后才最优。
然后就是解决前面的塔放2还是放3.。。。
我刚开始是按直接贪心做的...并不对....
然后按照DP来考虑,可是定义的状态不太好,导致处理问题的角度并不对...超时T_T。。
但是这道题目很简单呀~~
只不过当时脑子就是没能想起来 这样 定义状态...
其实定义d[i][j] 表示前i个单位中放置了j个第三种塔。。。然后默认i+1~n放置的都是红塔(因为红塔一定是放置在最后的)..然后很明显就放置了i-j个绿塔。。。
然后d[i][j]其实表示是在这个状态(默认i之后的都是红塔,只考虑前i个)下,只放置蓝塔和绿塔时~最优的情况下前i个会得到多少伤害值.....然后再加上后面的红塔伤害就好了。。。
注意那种n个单位全部放红塔的情况要考虑在内...不然wa到T_T。。。
code:
#include<cstdio> #include<cstring> #include<algorithm> #include<iostream> using namespace std; const int maxn = 1505; long long n,x,y,z,t; long long f[maxn][maxn]; void solve(){ memset(f, 0, sizeof(f)); long long ans = n * x * t; for(int i = 1; i <= n; i++){ for(int j = 0; j <= i; j++){ f[i][j] = f[i-1][j] + (i-1-j)*(j*z+t)*y; if(j > 0) f[i][j] = max(f[i][j], f[i-1][j-1] + (i-j)*((j-1)*z+t)*y); ans = max(ans, f[i][j]+(i-j)*y*(n-i)*(j*z+t) + x * (n-i) * (j*z+t)); } } cout << ans << endl; } int main(){ int tt; int cas = 0; scanf("%d",&tt); while(tt--){ cin >> n >> x >> y >> z >> t; printf("Case #%d: ",++cas); solve(); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:hdu
原文地址:http://blog.csdn.net/u013382399/article/details/46807457