P1005 矩陣取數遊戲 區間dp

2022-04-30 21:30:20 字數 1251 閱讀 2633

帥帥經常跟同學玩乙個矩陣取數遊戲:對於乙個給定的\(m*n\)的矩陣,矩陣中的每個元素\(a_\)均為非負整數。遊戲規則如下:

每次取數時須從每行各取走乙個元素,共n個。經過m次後取完矩陣內所有元素;

每次取走的各個元素只能是該元素所在行的行首或行尾;

每次取數都有乙個得分值,為每行取數的得分之和,每行取數的得分 = 被取走的元素值\(\times 2^i\)*,其中i表示第i次取數(從1開始編號);

遊戲結束總得分為m次取數得分之和。

帥帥想請你幫忙寫乙個程式,對於任意矩陣,可以求出取數後的最大得分。

除了腦殘高精度(反正窩用__int128硬生生水了過去,但是考場上不能用啊),是道還行的dp題。

窩的做法比起其它題解的做法low了很多,時間和空間效率都不是十分優秀,而且也似乎有人用了,還比我快(哭。

觀察題目,容易發現我們只能對每行分開進行\(dp\),而對每行的\(dp\)實際上就是乙個區間\(dp\),從大區間縮小到小區間。

設\(dp[i][l][r][j]\)表示第\(i\)次取數時,第\(j\)行左邊界取到\(l\),右邊界取到\(r\)時的最優解。

得到狀態轉移方程:

\[dp[i][l][r][j]=\max\limits_ \

\]如果直接這麼寫會炸空間。

觀察狀態轉移方程發現乙個狀態只與它上乙個狀態有關,於是考慮乙個滾動陣列優化。

#include#include#include#include#include#include#include#include#include#include#define n 101

#define ll __int128

#define inf 0x7ffffffff

using namespace std;

ll dp[2][n][n][n],n,m,a[n][n];//dp[i][l][r][j]表示第i次取數第j行的最大得分,左端點l,右端點r

inline ll read()

while(c>='0'&&c<='9')

return x*f;

}inline ll qp(ll a,ll b)//快速冪

return ans;

}int main()

} }ll ans=0;

for(int i=1;i<=n;++i)

if(!ans) printf("0\n");

else print(ans);

return 0;

}

洛谷 P1005 矩陣取數遊戲 區間dp

帥帥經常跟同學玩乙個矩陣取數遊戲 對於乙個給定的n times mn m的矩陣,矩陣中的每個元素a ai,j 均為非負整數。遊戲規則如下 每次取數時須從每行各取走乙個元素,共nn個。經過mm次後取完矩陣內所有元素 每次取走的各個元素只能是該元素所在行的行首或行尾 每次取數都有乙個得分值,為每行取數的...

洛谷 P1005 矩陣取數遊戲(區間DP)

會發現每一行之間沒有影響,可以做n次區間dp。設dp i j 表示區間 i,j 的取分最大值。如果從小區間向大區間轉移,即 dp i j max dp i 1 j a i dp i j 1 a j 2 這樣 2 i 在轉移的過程中便之間乘上了。ac 無高精 1 include2 include3 i...

P1005 矩陣取數遊戲 區間dp 高精度

帥帥經常跟同學玩乙個矩陣取數遊戲 對於乙個給定的n times mn m的矩陣,矩陣中的每個元素a ai,j 均為非負整數。遊戲規則如下 每次取數時須從每行各取走乙個元素,共nn個。經過mm次後取完矩陣內所有元素 每次取走的各個元素只能是該元素所在行的行首或行尾 每次取數都有乙個得分值,為每行取數的...