标签:ons 秘密武器 没有 不同的 can color 移动 处理 class
用f1[i][j]表示i到j这一段已经被消除且现在在i
用f2[i][j]表示i到j这一段已经被消除且现在在j
但是对f1[i][j]递推到其他状态时,我的决策影响的不仅仅是这一颗球,同时其他未被收集的球也在下坠,所以这道题在做决策时要顺便减去除被消除小球以外的速度和乘
移动的距离。
递推方程
f1[i][j]=max(f1[i+1][j]+a[i].y-(a[i+1].x-a[i].x)*(a[n].v-a[j].v+a[i].v),f2[i+1][j]+a[i].y-(a[j].x-a[i].x)*(a[n].v-a[j].v+a[i].v));
f2[i][j]=max(f2[i][j-1]+a[j].y-(a[j].x-a[j-1].x)*(a[n].v-a[j-1].v+a[i-1].v),f1[i][j-1]+a[j].y-(a[j].x-a[i].x)*(a[n].v-a[j-1].v+a[i-1].v));
对于a[i].v我进行了前缀和处理。
#include<cstdio> #include<algorithm> using namespace std; struct A { int x,y,v; }a[1005]; int f1[1005][1005],f2[1005][1005]; bool cmp(const A &t1,const A &t2) { return t1.x<t2.x; } int main() { int n,x0; scanf("%d%d",&n,&x0); for(int i=1;i<=n;i++) scanf("%d",&a[i].x); for(int i=1;i<=n;i++) scanf("%d",&a[i].y); for(int i=1;i<=n;i++) scanf("%d",&a[i].v); sort(a+1,a+n+1,cmp); for(int i=2;i<=n;i++) a[i].v+=a[i-1].v; for(int i=1;i<=n;i++) f1[i][i]=f2[i][i]=(x0<=a[i].x?x0-a[i].x:a[i].x-x0)*a[n].v+a[i].y; for(int l=2;l<=n;l++) for(int i=1;i+l-1<=n;i++) { int j=i+l-1; f1[i][j]=max(f1[i+1][j]+a[i].y-(a[i+1].x-a[i].x)*(a[n].v-a[j].v+a[i].v),f2[i+1][j]+a[i].y-(a[j].x-a[i].x)*(a[n].v-a[j].v+a[i].v)); f2[i][j]=max(f2[i][j-1]+a[j].y-(a[j].x-a[j-1].x)*(a[n].v-a[j-1].v+a[i-1].v),f1[i][j-1]+a[j].y-(a[j].x-a[i].x)*(a[n].v-a[j-1].v+a[i-1].v)); } printf("%.3lf",max(f1[1][n],f2[1][n])/1000.0); return 0; }
标签:ons 秘密武器 没有 不同的 can color 移动 处理 class
原文地址:http://www.cnblogs.com/bzmd/p/6247004.html