hdu 4939
題意:
長度為n個單位的map,每一個單位須要時間t來走完。
每一個單位能夠放置一個塔。一共同擁有三種塔,每種塔的作用不同:
1.僅僅能攻擊當前單位。每秒x點傷害(紅塔)
2.攻擊當前單位之后的全部單位,每秒y點傷害(綠塔)
3.使目標經過本單位之后減速,之后每單位須要的時間+z(藍塔)
問目標受到的最多的攻擊是多少
思路:
首先明白,1塔僅僅能放在最后才最優。
然后就是解決前面的塔放2還是放3.。
。
。
我剛開始是按直接貪心做的...并不正確....
然后依照DP來考慮。但是定義的狀態不太好。導致處理問題的角度并不正確...超時T_T。
。
可是這道題目非常easy呀~~
僅僅只是當時腦子就是沒能想起來 這樣 定義狀態...
事實上定義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; }
sigh....這種題目也做不出來真是水成了冰渣渣orz...
總結
- 上一篇: CodeHub#4 启动报名| 荷小鱼:
- 下一篇: 计划,许愿