題目描述
帥帥經常跟同學玩乙個矩陣取數遊戲:對於乙個給定的n×m
n \times m
n×m的矩陣,矩陣中的每個元素ai,
ja_
ai,j
均為非負整數。遊戲規則如下:
每次取數時須從每行各取走乙個元素,共n
nn個。經過m
mm次後取完矩陣內所有元素;
每次取走的各個元素只能是該元素所在行的行首或行尾;
每次取數都有乙個得分值,為每行取數的得分之和,每行取數的得分 = 被取走的元素值×2i
\times 2^i
×2i,其中i
ii表示第i
ii次取數(從1
11開始編號);
遊戲結束總得分為m
mm次取數得分之和。
帥帥想請你幫忙寫乙個程式,對於任意矩陣,可以求出取數後的最大得分。
輸入格式
輸入檔案包括n+1
n+1n+
1行:第1行為兩個用空格隔開的整數n
nn和mmm。
第2∽ n+
1\backsim n+1
∽n+1
行為n ×m
n \times m
n×m矩陣,其中每行有m
mm個用單個空格隔開的非負整數。
輸出格式
輸出檔案僅包含1
11行,為乙個整數,即輸入矩陣取數後的最大得分。
輸入輸出樣例
輸入 #1
231
2334
2
輸出 #182
說明/提示
n oi
p2007
noip\ 2007
noip20
07提高第三題
資料範圍:
60
%60\%
60%的資料滿足:$1\le n, m \le 30,答案不超過1016
10^10
16100
%100\%
100%
的資料滿足:1≤n
,m≤8
1\le n, m \le 8
1≤n,m≤
8,0≤ai
,j
≤1000
0 \le a_ \le 1000
0≤ai,j
≤10
00首先,可以很快判斷出,這是一道區間動態規劃的題,我就乾脆打了個遞迴式的動態規劃。
用f i,
jf_
fi,j
表示刪到頭是i
ii,尾是j
jj時最多的得分
轉移公式:
f i,
j=ma
x(fi
+1,j
+ai×
2m+i
−j−1
,fi,
j−1×
2m+i
−j−1
)f_=max(f_+a_i \times 2^ ,f_\times 2^)
fi,j=
max(
fi+1
,j+
ai×
2m+i
−j−1
,fi,
j−1
×2m+
i−j−
1)最後,這題還會爆lon
glon
glong long
longlo
ng。要麼用高精度;要麼用__i
nt
128\_\_int128
__int1
28所以,我用了__i
nt
128\_\_int128
__int1
28,方便一點。
#include
#define in(x) x=read()
#define maxn 81
#define bll __int128
using
namespace std;
inline
void
read
(register
int&x)
while
(c>=
'0'&&c<=
'9')
}int n,m;
int num[maxn]
;bll ans,p[maxn]
,f[maxn]
[maxn]
;bll dp
(int l,
int r)
void
print
(bll x)
intmain()
if(!ans)
printf
("0"
)//特判0
else
print
(ans)
;return0;
}
洛谷題解 P1005 矩陣取數遊戲
這真是一道有趣的題目。垃圾乙個 首先,我們知道,有乙個c 11才有的東西 int128,它的上界是 2 1 然後,我們知道,有乙個叫巨集定義的東西,它可以長這樣 define int int128。最後,有乙個玄學知識,main函式不僅可以是int,也可以是signed。基礎玄學知識介紹完畢。接下來...
洛谷p1005矩陣取數遊戲
原題 2 80超int,需要高精度計算,也可以int128.行和行之間沒有聯絡,所以只要單獨求每一行之後取和即可,dp過程中i,j分別表示左端點和右端點。include define lll int128 void print lll x int n,m lll ans 0 int a 100 ll...
洛谷 P1005 矩陣取數遊戲
好多題解的f i j 表示還剩 i j 沒取的最大值,如果這樣寫的話,最後還要取個max f i i a i 2 m 如果轉化一下題意來做也是可以的。include define int int128 不會高精,只能 int128水一波了,如果考試考到,也只能放棄了 using namespace ...