區間DP 矩陣取數遊戲

2021-07-22 11:39:31 字數 1436 閱讀 6049

試題**

noip2007 提高組

問題描述

帥帥經常跟同學玩乙個矩陣取數遊戲:對於乙個給定的

n*m的矩陣,矩陣中的每個元素

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

1. 每次取數時須從每行各取走乙個元素,共

n個。m次後取完矩陣所有元素;

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

3. 每次取數都有乙個得分值,為每行取數的得分之和,

每行取數的得分 = 被取走的元素值*2i

,其中 i表示第

i次取數(從1開始編號);

4. 遊戲結束總得分為

m次取數得分之和。

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

輸入格式

輸入包括

n+1行:

第1行為兩個用空格隔開的整數

n和m。

第2~n+1行為

n*m矩陣,其中每行有

m個用單個空格隔開的非負整數。

輸出格式

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

樣例輸入

2 31 2 3

3 4 2

樣例輸出 82

樣例輸入

1 44 5 0 5

樣例輸出

122樣例輸入

2 10

96 56 54 46 86 12 23 88 80 43

16 95 18 29 30 53 88 83 64 67

樣例輸出

316994

資料規模和約定

60%的資料滿足:1<=

n, m<=30, 答案不超過10

16100%的資料滿足:1<=n, m

<=80, 0<=aij

<=1000。

區間動態規劃:

取走乙個數後,剩下的是乙個區間,並且區間長度越來越小,所以外迴圈可以按區間長度遞增的方式

如下:

for (int j=1;j<=m-1;j++)//區間長度   

{ for (int k=1;k<=m-j;k++)//起點

{ int l=k+j;

f[k][l] = max(a[k] + 2 * f[k+1][l], a[l] + 2 * f[k][l-1]);

根據示例2

4 5 0 5

ans=2*f[1][4]

=2*(2*f[1][3]+a[4])

=2*(2*(2*f[1][2]+a[3])+a[4])

=2*(2*(2*(2*f[2][2]+a[1])+a[3])+a[4])

=2*(2*(2*(2*a[2]+a[1])+a[3])+a[4])

// f[j][j]=a[j]

二維圖形,左上角矩陣

P1005 矩陣取數遊戲 區間dp

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

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

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

NOIP2007 矩陣取數遊戲(區間DP)

傳送門 這道題第一眼看上去可能讓人以為是貪心 不過貪心並不行,因為每次的操作是有2的冪次方的權值的。這樣的話直接每次貪心最小的就目光短淺。所以那我們自然想到了dp。據說這是一道很正常的區間dp?區間dp的基本思想,就是先處理出小區間的最優解,再由多個小區間合併成乙個大區間。不過這道題的想法略微有些不...