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

2022-05-03 15:51:26 字數 3005 閱讀 3995

2023年noip全國聯賽提高組

時間限制: 1 s

空間限制: 128000 kb

題目等級 : ** gold

題解【問題描述】

帥帥經常跟同學玩乙個矩陣取數遊戲:對於乙個給定的n*m 的矩陣,矩陣中的每個元素aij均

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

1. 每次取數時須從每行各取走乙個元素,共n個。m次後取完矩陣所有元素;

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

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

其中i 表示第i 次取數(從1 開始編號);

4. 遊戲結束總得分為m次取數得分之和。

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

輸入描述 input description

第1行為兩個用空格隔開的整數n和m。

第2~n+1 行為n*m矩陣,其中每行有m個用單個空格隔開的非負整數。

輸出描述 output description

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

樣例輸入 sample input

2 31 2 3

3 4 2

樣例輸出 sample output

資料範圍及提示 data size & hint

樣例解釋

第 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

分類標籤 tags 點此展開 

動態規劃

區間型dp

高精度大陸地區

noip全國聯賽提高組

2023年

題解:個人覺得拿到60分就好,ac需要用高精度處理(特別噁心)。

60分**(long long即可)

//

2016/04/02 16:36:32

#include#define ref(i,x,y) for(long long i=x;i<=y;i++)

using

namespace

std;

long

long f[100][100

];long

long a[100][100

];long

long xm[37

];long

long

n,m,sum,ans;

intmain()

sum+=ans;

}cout

return0;

}

ac**:

1。inf進製版高精度+dp

#include #define ref(i,x,y) for(int i=x;i<=y;i++)

#define inf 10000000000000000ll//

考慮到long long 後邊有011,19位數必須是素數

#define n 81

using

namespace

std;

struct nodes,f[n][n],w,r;//

w r 左右邊

inta[n][n],n,m;

intmain()

ref(i,1

,m) f[i][i].num[

0]=a[l][i];

ref(i,2

,m)

ref(j,1,m-i+1

) s.num[

0]+=f[1][m].num[0

]; s.num[

1]+=f[1][m].num[1

];

if(s.num[0]>=inf)

s.num[

0]%=inf,s.num[1]++;

}if(s.num[1])//

是否高於19位

printf("

%lld%lld\n

",s.num[1],s.num[0

]);

else

printf(

"%lld\n

",s.num[0

]);

return0;

}

2。 10進製版高精度 +dp

#includeusing

namespace

std;

#define n 90

int n,m;bool

b;int

a[n],f[n][n][n];

int le[n],ri[n],s[n];//

高精度處理陣列

intmain()

else

if(le[q]

if(b)

for(int q=t1;q>=0;q--) f[j][j+i-1][q]=le[q];

else

for(int q=t2;q>=0;q--) f[j][j+i-1][q]=ri[q];

}for(int i=0;i1

][m][i];

}for(int i=0;i2

;

for(int i=0;i1;i++)

int w=n-1

;

while(s[w]==0&&w) w--;

for(int j=w;j>=0;j--) printf("%d"

,s[j]);

return0;

}

對比:

區間DP 矩陣取數遊戲

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

天梯 區間型動態規劃 1166 矩陣取數遊戲

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

wikioi 1166矩陣取數遊戲

本質上就是乙個在一行中頭尾取數情況下求出分數最大值。設d i,j 表示該行從i到j的合併分數 則d i,j 2 max 由於時間比較晚了,可能不夠時間寫高精度,先存普通版本演算法 include include include define maxn 100 int map maxn maxn in...