luoguP1005矩陣取數遊戲

2021-08-17 13:55:46 字數 1275 閱讀 5700

題目描述

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

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

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

3.每次取數都有乙個得分值,為每行取數的得分之和,每行取數的得分 = 被取走的元素值

2^i,其中i表示第i次取數(從1開始編號);

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

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

輸入輸出格式

輸入格式:

輸入檔案game.in包括n+1行:

第1行為兩個用空格隔開的整數n和m。

第2~n+1行為n*m矩陣,其中每行有m個用單個空格隔開的非負整數。

資料範圍:

60%的資料滿足:1<=n, m<=30,答案不超過10^16

100%的資料滿足:1<=n, m<=80,0<=aij<=1000

輸出格式:

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

輸入輸出樣例

輸入樣例#1: 複製

2 31 2 3

3 4 2

輸出樣例#1: 複製

82說明

noip 2007 提高第三題

分析

明顯的區間dp

對每一段的m長的行向量做區間的dp效率o(m^3)

加上取n個數於是效率是o(n*m^3);

有一點要注意就是說由於涉及到了2的n次所以有可能會爆long long所以要打高精度;

我發現了c++的乙個黑科技就是__int128不知道聯賽的時候可不可以用;

反正luogu可以用就過了

附上**:

#include#include#include#define ll __int128

using namespace std;

ll p[85],f[85][85],ans;

int a[85],n,m;

ll dfs(int l,int r)

void print(ll x)

int main()

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

else print(ans);

return 0;

}

luogu P1005 矩陣取數遊戲

題目傳送門 題意 有乙個n m的矩陣,求取所有數的最大值。注意 取數有且僅能從當前行兩邊取且對於每一次取數,都要從每一行取乙個,取數的值 被取走的元素值 2 i,i表示當前取到第i個數。思路 區間dp,我們可以知道每一行與其他行沒有聯絡,將每一行的最大值加起來,就可以推方程了。include inc...

洛谷P1005 NOIP2007 矩陣取數遊戲

抄的高精度模板233 由於要取完所有的數,所以原題可轉化為在每一行上取數,累加所有行的答案即可 f k i j 表示在第k行從1取到i,從j取到m的答案 f k i j max f k i 1 j 2 m j i 1 a k i 1 f k i j 1 2 m j i 1 a k j 1 第一次寫把...

P1005 矩陣取數

看完題可能第一時間並沒有清晰的思路。讓我們一步一步的來考慮這道題目。題目中描述操作為每次從所有的行中選取,這樣做有些麻煩。仔細思考一下可以發現行與行之間互不干涉,所以我們可以對每行操作到底,最後統計答案。每行怎麼選取當然難不倒聰明的oier了,設f i j 表示某行從第i位到第j位的最優答案。轉移如...