帥帥經常跟同學玩乙個矩陣取數遊戲:對於乙個給定的n \times mn×m的矩陣,矩陣中的每個元素a_ai,j均為非負整數。遊戲規則如下:
每次取數時須從每行各取走乙個元素,共nn個。經過mm次後取完矩陣內所有元素;
每次取走的各個元素只能是該元素所在行的行首或行尾;
每次取數都有乙個得分值,為每行取數的得分之和,每行取數的得分 = 被取走的元素值\times 2^i×2i,其中ii表示第ii次取數(從11開始編號);
遊戲結束總得分為mm次取數得分之和。
帥帥想請你幫忙寫乙個程式,對於任意矩陣,可以求出取數後的最大得分。
輸入格式:
輸入檔案包括n+1n+1行:
第11行為兩個用空格隔開的整數nn和mm。
第2\backsim n+12∽n+1行為n \times mn×m矩陣,其中每行有mm個用單個空格隔開的非負整數。
輸出格式:
輸出檔案僅包含11行,為乙個整數,即輸入矩陣取數後的最大得分。
輸入樣例#1: 複製
2 3輸出樣例#1: 複製1 2 3
3 4 2
82noip 2007 提高第三題
資料範圍:
60%的資料滿足:1\le n, m \le 301≤n,m≤30,答案不超過10^1016
100%的資料滿足:1\le n, m \le 801≤n,m≤80,0 \le a_ \le 10000≤ai,j≤1000
和校賽那題幾乎一模一樣 比賽反而更簡單 因為不用高精度
60分答案:
#includeusingview codenamespace
std;
//input by bxd
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define repp(i,a,b) for(int i=(a);i>=(b);--i)
#define ri(n) scanf("%d",&(n))
#define rii(n,m) scanf("%d%d",&n,&m)
#define riii(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define rs(s) scanf("%s",s);
#define ll long long
#define rep(i,n) for(int i=0;i
#define clr(a,v) memset(a,v,sizeof a)
/////////////////////////////////
/#define inf 0x3f3f3f3f
#define n 1000+5ll dp[n][n];
ll fast(ll x,
intn)
return
ans;
}int
a[n];
intmain()
ans+=dp[1
][m];
}cout
<
return0;
}
P1005 矩陣取數遊戲 區間dp
帥帥經常跟同學玩乙個矩陣取數遊戲 對於乙個給定的 m n 的矩陣,矩陣中的每個元素 a 均為非負整數。遊戲規則如下 每次取數時須從每行各取走乙個元素,共n個。經過m次後取完矩陣內所有元素 每次取走的各個元素只能是該元素所在行的行首或行尾 每次取數都有乙個得分值,為每行取數的得分之和,每行取數的得分 ...
洛谷 P1005 矩陣取數遊戲 區間dp
帥帥經常跟同學玩乙個矩陣取數遊戲 對於乙個給定的n times mn m的矩陣,矩陣中的每個元素a ai,j 均為非負整數。遊戲規則如下 每次取數時須從每行各取走乙個元素,共nn個。經過mm次後取完矩陣內所有元素 每次取走的各個元素只能是該元素所在行的行首或行尾 每次取數都有乙個得分值,為每行取數的...
洛谷 P1005 矩陣取數遊戲(區間DP)
會發現每一行之間沒有影響,可以做n次區間dp。設dp i j 表示區間 i,j 的取分最大值。如果從小區間向大區間轉移,即 dp i j max dp i 1 j a i dp i j 1 a j 2 這樣 2 i 在轉移的過程中便之間乘上了。ac 無高精 1 include2 include3 i...