這真是一道有趣的題目。 ——垃圾乙個
首先,我們知道,有乙個基礎玄學知識介紹完畢。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次的區間取數問題...