【冲刺 NOIP2022 模拟赛 B 组 Day9】开采矿物【DP】

【冲刺 NOIP2022 模拟赛 B 组 Day9】开采矿物【DP】_第1张图片

思路:

发现所有的算式里都有p因式,所以直接把p提出来到最后再乘
我们直接倒过来做,设f[i]为n到i的最大净收入,转移方程就是 f i = m a x ( f i + 1 , f i + 1 ∗ ( 1 − 0.01 k ) + a i ) f_i=max(f_{i + 1}, f_{i + 1} * (1 - 0.01k) + a_i) fi=max(fi+1,fi+1(10.01k)+ai)

c o d e code code

#include
#include

using namespace std;

const int MAXN = 1e5 + 10;

int n, k, c, w;
int type[MAXN], x[MAXN];
double f[MAXN];

int main() {
	freopen("exploit.in", "r", stdin);
	freopen("exploit.out", "w", stdout);
	scanf("%d%d%d%d", &n, &k, &c, &w);
	for(int i = 1; i <= n; i ++) scanf("%d%d", &type[i], &x[i]);
	for(int i = n; i >= 1; i --) {
		if(type[i] == 1) f[i] = max(f[i + 1], f[i + 1] * (1 - 0.01 * k) + x[i]);
		else f[i] = max(f[i + 1], f[i + 1] * (1 + 0.01 * c) - x[i]);
	}
	printf("%.2lf", f[1] * w);
	return 0;
} 

你可能感兴趣的:(题解,DP,算法,c++,题解,DP)