/*注意子问题的构造和提取。 这道题从最开始的情况考虑。一直到两端。 f[i][j]=max(f[i+1][j]+a[i]*(t-j+i),f[i][j-1]+a[j]*(t-j+i));注意(t-j+i)表示次数。 循环注意顺序。目标是使子问题的解得以重复利用。 dp要认真考虑他的子问题和状态转移。 注意预处理和循环。*/ #include <iostream> #include <stdio.h> #include <cstring> #include <cmath> #define max(a,b) ((a)>=(b)?(a):(b)) using namespace std; const int mm=1505; int f[mm+2][mm+2]; int a[mm+2]; int main() { int t; while(scanf("%d",&t)==1&&t) { memset(f,0,sizeof(f)); for(int i=1; i<=t; i++) scanf("%d",&a[i]); for(int i=1; i<=t; i++) f[i][i]=t*a[i]; for(int i=t-1; i>=1; i--) for(int j=i+1; j<=t; j++) f[i][j]=max(f[i+1][j]+a[i]*(t-j+i),f[i][j-1]+a[j]*(t-j+i)); printf("The Max Value Is %d.\n",f[1][t]); } return 0; }
hoj Quantum Blasting DP
最新推荐文章于 2020-01-25 15:33:30 发布