【問題描述】帥帥經常跟同學玩乙個矩陣取數遊戲:對於乙個給定的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 31 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次後取完矩陣所有元...