BZOJ1897 tank 坦克遊戲

2021-09-07 12:52:55 字數 806 閱讀 7237

設$f[i][j][k]$表示坦克位於$(i,j)$,目前打了不超過$k$個位置的最大得分。

初始值$f[1][1][k]$為在$(1,1)$射程內最大$k$個位置的分數總和。

對於每次移動,會新增一行或者一列$o(r)$個位置,那麼顯然也是從大到小取。

暴力轉移是$o(r)$的,不能接受,但是注意到這是個凸函式,故存在決策單調性,分治求解即可。

$ans=\max(f[i][j][t-i-j+2])$

時間複雜度$o(nm(t+r\log r))$。

#include#includeusing namespace std;

const int n=505,m=255;

int t,n,m,r,_n,_m,lim,o,i,j,k,a[n][n],f[2][n][m],g[m],v[m],q[n*n],cnt,ans;

inline bool cmp(int x,int y)

inline void up(int&x,int y)

if(lm)solve(m+1,r,dm,dr);

}int main()

for(i=o=1;i<=_n;i++,o^=1)for(j=1;j<=_m;j++)

for(k=0;k<=lim;k++)f[o][j][k]=v[k];

}if(j>1)

for(k=0;k<=lim;k++)up(f[o][j][k],v[k]);

}up(ans,f[o][j][lim]);

} return printf("%d",ans),0;

}

189 旋轉陣列

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。示例 1 輸入 1,2,3,4,5,6,7 和 k 3 輸出 5,6,7,1,2,3,4 解釋 向右旋轉 1 步 7,1,2,3,4,5,6 向右旋轉 2 步 6,7,1,2,3,4,5 向右旋轉 3 步 5,6,7,1,2,3,...

189 旋轉陣列

給定乙個陣列,將陣列中的元素向右移動 k 個位置,其中 k 是非負數。說明 class solution def rotate self,nums list int k int none do not return anything,modify nums in place instead.n le...

189 旋轉陣列

兩種思路 第乙個,開闢乙個陣列,i下標儲存原陣列中 i k mod n下標的元素,再依次賦值給原陣列。空間複雜度o n 第二個,三次逆序陣列 定義 reverse 逆轉方法 將陣列元素反轉,比如 1,2,3,4 逆轉後變成 4,3,2,1 對前 n k 個元素 1,2,3,4 進行逆轉後得到 4,3...