nssl1322,jzoj(初中)2109-清兵线【dp】
正題
題目大意
nnn個士兵在不同的位置,自己每秒可以往左移或者往右移動1格,并且干掉改格所在的士兵。
 有mmm秒,第kkk秒干掉士兵可以獲得m?km-km?k的價值,求最大價值之和。
解題思路
離散化先
 然后我們干掉的士兵一定一個線段,所以我們設
 fi,j,t,0/1f_{i,j,t,0/1}fi,j,t,0/1?表示第tst\ st?s已經干掉了i~ji\sim ji~j的士兵,然后在最左邊還是在最右邊
但是我們發現ttt的范圍十分的大,我們考慮轉換。
假設我們總共要干掉kkk個人,如果還剩下zzz個人沒被干掉,那么沒移動一步就會消耗kkk點價值。
那么我們就可以列出新的方程fi,j,k,0/1f_{i,j,k,0/1}fi,j,k,0/1?表示總共要干掉i~ji\sim ji~j的士兵,然后在最左邊還是在最右邊。
然后因為全程kkk那個維度不會有任何交接我們可以不用記錄,但是還是要枚舉kkk。
最終狀態:
 設fi,j,0/1f_{i,j,0/1}fi,j,0/1?表示總共干掉kkk個人,已經干掉了i~ji\sim ji~j的人,在最左邊還是在最右邊,
那么我們可以列出動態轉移方程
 fi,j,0=max{fi+1,j,0+m?dist(i,i+1)?(k?j+i),fi+1,j,1+m?dist(i,j)?(k?j+i)}f_{i,j,0}=max\{f_{i+1,j,0}+m-dist(i,i+1)*(k-j+i),f_{i+1,j,1}+m-dist(i,j)*(k-j+i)\}fi,j,0?=max{fi+1,j,0?+m?dist(i,i+1)?(k?j+i),fi+1,j,1?+m?dist(i,j)?(k?j+i)}
 fi,j,1=max{fi,j?1,1+m?dist(j,j?1)?(k?j+i),fi,j?1,0+m?dist(i,j)?(k?j+i)}f_{i,j,1}=max\{f_{i,j-1,1}+m-dist(j,j-1)*(k-j+i),f_{i,j-1,0}+m-dist(i,j)*(k-j+i)\}fi,j,1?=max{fi,j?1,1?+m?dist(j,j?1)?(k?j+i),fi,j?1,0?+m?dist(i,j)?(k?j+i)}
然后答案就是fl,r(r?l+1=k,mid∈[l..r])f_{l,r}(r-l+1=k,mid\in [l..r])fl,r?(r?l+1=k,mid∈[l..r])
codecodecode
#pragma GCC optimize(2) #include<cstdio> #include<algorithm> #include<cstring> #include<cctype> using namespace std; const int N=320; int n,m,a[N],ans,K; int f[N][N][2]; inline int read() {int x=0,f=1; char c=getchar();while(!isdigit(c)) {if(c=='-')f=-f;c=getchar();}while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();return x*f; } int main() {n=read();m=read();for(int i=1;i<=n;i++)a[i]=read();a[++n]=0;sort(a+1,a+1+n);int mid=lower_bound(a+1,a+1+n,0)-a;for(K=1;K<=n;K++){memset(f,0xcf,sizeof(f));f[mid][mid][0]=f[mid][mid][1]=0;for(int i=mid;i>0;i--)for(int j=mid;j<=n;j++){if(i==j) continue; if(j-i+1>K) break;f[i][j][0]=max(f[i+1][j][0]+m-(a[i+1]-a[i])*(K-j+i),f[i+1][j][1]+m-(a[j]-a[i])*(K-j+i));f[i][j][1]=max(f[i][j-1][1]+m-(a[j]-a[j-1])*(K-j+i),f[i][j-1][0]+m-(a[j]-a[i])*(K-j+i));if(j-i+1==K) ans=max(ans,max(f[i][j][0],f[i][j][1]));} }printf("%d",ans); }總結
以上是生活随笔為你收集整理的nssl1322,jzoj(初中)2109-清兵线【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 在Mac电脑中如何设置屏幕保护的显示效果
- 下一篇: 怎么样在旧电脑上安装Windows11w
