題目描述
帥帥經常跟同學玩乙個矩陣取數遊戲:對於乙個給定的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位的最優答案。轉移如...