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

2022-05-01 16:30:14 字數 1565 閱讀 3689

帥帥經常跟同學玩乙個矩陣取數遊戲:對於乙個給定的n \times mn×m的矩陣,矩陣中的每個元素a_ai,j​均為非負整數。遊戲規則如下:

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

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

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

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

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

輸入格式:

輸入檔案包括n+1n+1行:

第11行為兩個用空格隔開的整數nn和mm。

第2\backsim n+12∽n+1行為n \times mn×m矩陣,其中每行有mm個用單個空格隔開的非負整數。

輸出格式:

輸出檔案僅包含11行,為乙個整數,即輸入矩陣取數後的最大得分。

輸入樣例#1: 複製

2 3

1 2 3

3 4 2

輸出樣例#1: 複製

82
noip 2007 提高第三題

資料範圍:

60%的資料滿足:1\le n, m \le 301≤n,m≤30,答案不超過10^1016

100%的資料滿足:1\le n, m \le 801≤n,m≤80,0 \le a_ \le 10000≤ai,j​≤1000

和校賽那題幾乎一模一樣  比賽反而更簡單 因為不用高精度

60分答案:

#includeusing

namespace

std;

//input by bxd

#define rep(i,a,b) for(int i=(a);i<=(b);i++)

#define repp(i,a,b) for(int i=(a);i>=(b);--i)

#define ri(n) scanf("%d",&(n))

#define rii(n,m) scanf("%d%d",&n,&m)

#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)

#define rs(s) scanf("%s",s);

#define ll long long

#define rep(i,n) for(int i=0;i

#define clr(a,v) memset(a,v,sizeof a)

/////////////////////////////////

/#define inf 0x3f3f3f3f

#define n 1000+5ll dp[n][n];

ll fast(ll x,

intn)

return

ans;

}int

a[n];

intmain()

ans+=dp[1

][m];

}cout

<

return0;

}

view code

P1005 矩陣取數遊戲 區間dp

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

洛谷 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...