題目描述
帥帥經常跟同學玩乙個矩陣取數遊戲:對於乙個給定的n*m的矩陣,矩陣中的每個元素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 3
1 2 3
3 4 2
輸出樣例#1:
82 這題要寫乙個高精度,高精度乘法我們可以用多次加法代替,這樣比較好寫
題解:
題目中每次取數的得分因每次均從行首或者行尾取 故可以累加每行的得分求最後總的m次取數的分之和。
方案一:
根據題目 寫出簡單方程式 進行dp
f(i,j)表示 對i~j這些整數進行 j-i+1次操作後結果的最大值
優化①:提前將2的次方計算出並儲存至陣列中備用
根據分析題目 題目資料範圍m<=80 即最高可能產生的大小,據運算位數為35位即使longlong也無法存下 故本題考慮高精度。
由於需要使用高精度乘法及高精度加法故本題對於程式編寫難度要求很高。
#include
#include
#include
char ans[30],anss[30],sum[30],a[88][10],data[88][88][30];int aa,n,m;
bool ff[88][88];
void plus(char j1,char j2)
if (jw!=0)
ans[max]='\0';
//printf("%s",ans);
}void maxx(char j1,char j2)
if (l1strcpy(anss,j2);
//for (int i=0;ireturn;
}for (int i=0;iif (j1[i]>j2[i])
if (j1[i]strcpy(anss,j2);
//for (int i=0;ireturn;}}
strcpy(anss,j2);
}void f(int i,int j)
char tmp[30]="",tmp1[30]="";
if (ff[i+1][j]==false) f(i+1,j);
//f(i+1,j);
plus(data[i+1][j],a[i]);
strcpy(tmp,ans);
plus(tmp,tmp);
//int l=strlen(ans);
strcpy(tmp1,ans);
//for (int i=1;iif (ff[i][j-1]==false) f(i,j-1);
//f(i,j-1);
plus(data[i][j-1],a[j]);
strcpy(tmp,ans);
plus(tmp,tmp);
maxx(ans,tmp1);
strcpy(data[i][j],anss);
ff[i][j]=true;
}int main()
memset(ff,false,sizeof(ff));
f(1,m);
plus(sum,data[1][m]);
strcpy(sum,ans);
}printf("%s",sum);
return
0;}
NOIP2007 矩陣取數遊戲
傳送門給定乙個n m的矩陣,在每一行中取m次數,每次取數只能從行首或尾取數,第i次取數的貢獻是 2 i 該點值 操作n行,求最大答案 n,m 80 不難發現行與行之間是完全獨立的,所以單獨處理每一行就好了 考慮區間dp 設 dp i j 表示區間i j的答案最大值 則有 dp i j max num...
NOIP2007 矩陣取數遊戲
鏈結 簡單dp 毒瘤高精 顯然行與行沒有關聯 所以只需要每行處理 考慮dp i,j,k 表示第i次取數,第j行,有k次取的頭的最大分數 直接dp即可 includeusing namespace std define ll int128inline intread while ch 0 ch 9 d...
noip2007矩陣取數遊戲 2008 11 5
noip2007矩陣取數遊戲 2008.11.5 注意 比大小位數不相同時,取位數大的數大 當位數相同時,要從最高位開始比較,相同,則往下比,不相同,則大的數就大。我剛開始,弄成了從最低位開始比較,故,wa了 20多分鐘 小結 這道題,我打了不下 5遍,一定要先想好,在紙上把每個細節都確定了,並確定...