这个题目和费用提前算不太一样 两者本质上都是消除后效性
这个题不同的就是不知道后面到底哪些要选 而费用提前算是后面的一定都是会选的
所以这个题巧妙地从后往前转移 这样转移前面的一定是后面最优策略 转移方程非常像算期望值
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
#define maxn 100005
double f[maxn];
double n,k,c,w;
int a[maxn],b[maxn];
int main()
{
int i;
scanf("%lf%lf%lf%lf",&n,&k,&c,&w);
for(i=1;i<=n;i++) scanf("%d%d",&a[i],&b[i]);
for(i=n;i>=1;i--)
{
if(a[i]==1) f[i]=max(f[i+1],f[i+1]*(1-k/100)+b[i]);
if(a[i]==2) f[i]=max(f[i+1],f[i+1]*(1+c/100)-b[i]);
}
printf("%.2lf",f[1]*w);
}