题意:A代表你的初始攻击力,D代表你每回合递增攻击力,A,D初始为0。
第一行给一个t,代表t组测试数据
给你N个回合(n<=100),第i个回合有3个数字a[i],b[i],c[i](范围均1e9),代表有三种选择,1.攻击,造成A+a[i]的伤害
2.使D增加b[i]
3.使A增加c[i]
问,经过N回合后最多可以造成多少伤害
样例如下。。
一眼看出是个DP,但是不好推。一开始在想DP存什么,怎么开数组,因为当前造成的伤害,A,D的数量级都是1e9.又不能贪心证明当前的三种选择哪一种最优。想了一个小时快自闭才发现倒推。。实属DD。
想出倒推之后转化题意,倒推的过程中是不知道现在的A和D是多少的。那么我只用管造成的伤害就行了。设当前回合为第i回合。如果选择攻击,那么造成伤害+a[i],假设当前回合选择使A增加c[i],那么在第i-n的回合中每一次进攻造成的伤害就会增加c[i],倒推过程中,假设之前进攻了k次,并且当前回合选择了把A增加c[i],那么伤害就会增加k*c[i]。同理,如果当前回合选择使D增加b[i],那么如果在第q个回合攻击,伤害就会增加(q-i)*b[i],这是进攻一次的情况。那么如果这个回合之后进攻了k次,那么每次伤害会增加(q1+q2+...+qk - k*i )*b[i],令之前那些q的总和为j,那么伤害就会增加(j-i*k)*b[i]。这里的j指“倒推过程中,之前进攻的回合数之和”。
#include <bits/stdc++.h>
using namespace std;
#def