題目鏈結
題目大意:求\(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 個小朋友排成一列。每個小朋友手上都有乙個數字,這個數字可正可負。規定每個小朋友的特徵值等於排在他前面 包括他本人 的小朋友中連續若干個 最少有乙個 小朋友手上的數字之和的最大值。作為這些小朋友的老師,你需要給每個小朋友乙個分數,分數是這樣規定的 第乙個小朋友的分數是他的特徵值,其它小朋友的分...