設$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...