題解 P1982 小朋友的數字

2022-05-08 01:48:08 字數 1178 閱讀 6346

題目鏈結

題目大意:求\(max\\),其中\(f[i]= max\\)d[j]$表示區間[1,j]內的最大連續子段和

動態規劃

​ 分析:看了題目題目大意,這題顯然還是挺水的吧.

​ 我們先看狀態\(d\)怎麼求:

​ 我們設\(td[i]\)表示以\(i\)結尾的最大連續子段和,那麼顯然

​ \(td[i] = max(td[i - 1] + val[i],val[i])\),\(val[i]\)即第\(i\)個小朋友每人手上的數字

​ 然鵝我們要求的是\([1,j]\)內的最大連續子段和

​ 所以\(d[i] = max(d[i - 1],td[i])\)這個顯然還是很容易想到吧?

​ 解決了狀態\(d\)以後,我們再來看狀態\(f\)如何求.這題的狀態顯然是\(o(n)\)的,可是如果\(o(n)\)轉移的話,複雜度會炸成\(o(n ^ 2)\),無法接受.那麼快速轉移有幾種方法:

​ 另外此題有坑點,會爆\(long\;long\)

​ 解決方案:

#include #include #include using namespace std;

typedef __int128 type;//我也是迫不得已

const type inf = 0x7fffffffffffffff;//就用long long的極值吧

template inline void read(t &x)

char buf[32];

template inline void write(t x)while(x);

for(;p;p--)

putchar(buf[p] + '0');

}type temp_d,d,temp_f,f,x,mod,ans = -inf;//幾個臨時變數,具體後面**

int n;

int main()

if(ans < 0)putchar('-'),ans = -ans;//特判負數

write(ans % mod);putchar('\n');//輸出

return 0;

}

這份**執行時間還可以進一步縮短,\(fread\)讀入優化蒟蒻懶得寫了,各位有興趣可以衝一下最優解

P1982 小朋友的數字

有 nn個小朋友排成一列。每個小朋友手上都有乙個數字,這個數字可正可負。規定每個小朋友的特徵值等於排在他前面 包括他本人 的小朋友中連續若干個 最少有乙個 小朋友手上的數字之和的最大值。作為這些小朋友的老師,你需要給每個小朋友乙個分數,分數是這樣規定的 第乙個小朋友的分數是他的特徵值,其它小朋友的分...

洛谷P1982 小朋友的數字 題解

題目傳送 簡單地說,這題就是讓我們求前i個數的最大子串和和最值。對於最大子串和,我們可以設乙個變數qian,表示以當前元素結尾的最大子串的子串和。若搜尋完第i 1個小朋友,現在看到第i個小朋友時,若qian大於0,就說明以第i 1個小朋友為結尾的最大子串和的值大於0,那麼讓這小朋友連上這個字串的話得...

洛谷P1982 小朋友的數字

有 n 個小朋友排成一列。每個小朋友手上都有乙個數字,這個數字可正可負。規定每個小朋友的特徵值等於排在他前面 包括他本人 的小朋友中連續若干個 最少有乙個 小朋友手上的數字之和的最大值。作為這些小朋友的老師,你需要給每個小朋友乙個分數,分數是這樣規定的 第乙個小朋友的分數是他的特徵值,其它小朋友的分...