1D1D动态规划问题。网上的大多都说有三类,然而我觉得吧,就是两类,一类利用单调性和斜率优化可以解决的,主要是因为能证明单调性(斜率与二元组的横坐标同时满足单调性,实际上很多时候都不用列二元组,你搞斜率优化的时候看得出来吧)那不单调就只能这样搞了。
暴力。
/* O(n^2)暴力DP,f表示这天有多少人民币,转移时就转换成券来求 A表示A券价值,B表示B券价值,S表示这个券的数量 题意得:A*Sa+B*Sb=F,Sa/Sb=R (A*R+B)*Sb=F; Sb=F/(A*R+B); Sa=Sb*R; */ #include<cstdio> #include<iostream> #include<cstring> #include<cstdlib> #include<algorithm> #include<cmath> using namespace std; double a[110000],b[110000],r[110000],f[110000]; int main() { int n; memset(f,0,sizeof(f)); scanf("%d%lf",&n,&f[0]); for(int i=1;i<=n;i++) { scanf("%lf%lf%lf",&a[i],&b[i],&r[i]); f[i]=f[i-1]; for(int j=i-1;j>=1;j--) { //劵->钱 double Sa,Sb;//劵数 Sb=f[j]/(a[j]*r[j]+b[j]); Sa=Sb*r[j]; f[i]=max(f[i],a[i]*Sa+b[i]*Sb); } } printf("%.3lf\n",f[n]); return 0; }