矩陣取數遊戲 Codevs 1166

2021-07-14 01:58:45 字數 1987 閱讀 8240

題目位址——

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

m 的矩陣,矩陣中的每個元素 ai

j 均為非負整數。

遊戲規則如下:

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

n 個。

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

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

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

, 其中 i

表示第

i次取數(從

1 開始編號);

4.遊戲結束總得分為

m 次取數得分之和。

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

輸出僅包含

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

2 3

1 2 3

3 4 2

60%

的資料滿足:

1<=n,

m<=

30 , 答案不超過

1016

100% 的資料滿足:

1<=n,

m<=

80 ,

0<=ai

j<=

1000

首先,我們可以分行處理。

對於每一行,設 fi

,j表示

i 到

j的最大得分。

則可以分成兩種情況:

一:選擇最左端的數字。

二:選擇最右端的數字。 則 f

i,j=

max(

fi,j

−1+n

uml,

j×2m

−(j−

i),f

i+1,

j+nu

ml,i

×2m−

(j−i

))其中,

l 表示當前的行號, nu

mi,j

表示原矩陣中第

i 行第

j列的數字。

#include 

#include

#include

#define max(x,y) ((x)>(y)?(x):(y))

#define ll long long

#define mod 10000000

using

namespace

std;

char ss[50];

struct bign

bign(const

int num)

bign operator = (const

int &num)

bign operator = (const

char*str)

return *this;

}bign operator * (const bign &num)

while(!c.s[c.len]&&c.len>1)c.len--;

return c;

}bign operator + (const bign&num)

if(c.s[c.len+1])c.len++;

return c;

}bool

operator > (const bign&num)const

void out()

}};int n,m;

bign ans;

int num[100][100];

bign f[100][100];

bign tmpss=1,tmpss2=2;

bign power(int y)

int main()

ans.out();

return

0;}

矩陣取數遊戲

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

1574 矩陣取數遊戲

1574 矩陣取數遊戲 時間限制 1000 ms 記憶體限制 524288 kb 提交數 618 通過數 248 題目描述 經常和同學玩乙個矩陣取數遊戲 對於給定的 n m 的矩陣,矩陣中每個元素 aij 均為非負整數。遊戲規則如下 1 每次取數時必須從每行各取走乙個元素,共 n 個,m 次取完所有...

17 11 4 矩陣取數遊戲

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