洛谷題解 P1005 矩陣取數遊戲

2022-03-06 16:03:47 字數 1195 閱讀 4032

這真是一道有趣的題目。 ——垃圾乙個

首先,我們知道,有乙個c++11才有的東西:__int128,它的上界是\(2^-1\)。

然後,我們知道,有乙個叫巨集定義的東西,它可以長這樣#define int __int128

最後,有乙個玄學知識,main函式不僅可以是int,也可以是signed

基礎玄學知識介紹完畢。

接下來說說如何\(dp\)。

首先我們僅考慮每一行如何取(具體原因自行看題)。

然後對於每一行,我們僅考慮取頭與取尾的\(max\)值(具體原因同上)。

然後定義\(f_\)為取區間\([i,j]\)的最大值,定義\(a_i\)為該行第\(i\)個數。

則轉移方程為:

\(f_=\max+a_i \times x,f_+a_j \times x},x\)為題目說的要加的數。

接下來考慮如何降維打擊。

你想,如果取的時候先乘上乙個2,然後每次遇到乙個區間時在乘2,最後效果其實是一樣的。

所以\(dp\)式變成:

\(f_=\max+2 \times a_i,2 \times f_+2 \times a_j}\)

化簡為:

\(f_=\max+a_i),2 \times (f_+a_j)}\)

即核心**為

int dp(int sum)

然後使用我們的基礎玄學知識。

果斷ce,沒猜錯吧?

__int128不自帶輸入輸出!!!

這裡提供快讀快寫的板子。

最後放個總**。

#includeusing namespace std;

#define int __int128

int a[90][90];

int f[90][90];

int n,m;

templatevoid qin(t &x)

void qout(int x)

int dp(int sum)

int main()

洛谷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 ...

洛谷 P1005 矩陣取數遊戲

沒錯 本齟齬又來水題解了 題目鏈結 給你乙個大小為n m的矩陣,你將進行m次操作,每次操作可以拿矩陣中每一行兩端的其中乙個數字,每個數字只能拿一次。拿乙個數字的貢獻為該數字的權值val 2 i 這個數是在第i次操作被拿走的 然後問在m次操作後最大貢獻和為多少。這道題就很像乙個執行了n次的區間取數問題...