wikioi 1166 矩陣取數遊戲

2021-06-23 08:57:31 字數 1604 閱讀 4564

【問題描述】

帥帥經常跟同學玩乙個矩陣取數遊戲:對於乙個給定的n*m 的矩陣,矩陣中的每個元素aij均

為非負整數。遊戲規則如下:

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

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

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

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

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

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

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

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

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

2 3

1 2 3

3 4 2

82

樣例解釋

第 1 次:第1 行取行首元素,第2 行取行尾元素,本次得分為1*21+2*21=6

第2 次:兩行均取行首元素,本次得分為2*22+3*22=20

第3 次:得分為3*23+4*23=56。總得分為6+20+56=82

【限制】

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

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

題解:高精度+dp,狀態轉移方程:dp[i][j]=max;

#include#includeusing namespace std;

int n,m,a[81];

int f[81][81][31];

int ys[81][31];

int ans[31];

int c[31];

void mul(int x,int y,int z)

while(c[c[0]+1])

for(int i=0;i<=30;++i) x[i]=c[i];

}void add(int x,int y,int z)

if(c[c[0]+1]) c[0]++;

for(int i=0;i<=30;++i) x[i]=c[i];

}bool max(int x,int y)

return 1;

}int main()

for(int k=2;k<=m;++k)

for(int lx=1;lx<=m-k+1;++lx)

add(ans,ans,f[1][m]);

}printf("%d",ans[ans[0]]);

for(int i=ans[0]-1;i>=1;--i) printf("%05d",ans[i]);//逐位輸出

printf("\n");

return 0;

}

wikioi 1166矩陣取數遊戲

本質上就是乙個在一行中頭尾取數情況下求出分數最大值。設d i,j 表示該行從i到j的合併分數 則d i,j 2 max 由於時間比較晚了,可能不夠時間寫高精度,先存普通版本演算法 include include include define maxn 100 int map maxn maxn in...

矩陣取數遊戲 Codevs 1166

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

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

2007年noip全國聯賽提高組 時間限制 1 s 空間限制 128000 kb 題目等級 gold 題解 問題描述 帥帥經常跟同學玩乙個矩陣取數遊戲 對於乙個給定的n m 的矩陣,矩陣中的每個元素aij均 為非負整數。遊戲規則如下 1.每次取數時須從每行各取走乙個元素,共n個。m次後取完矩陣所有元...