Luogu P1115 最大子段和(dp 贪心)
生活随笔
收集整理的這篇文章主要介紹了
Luogu P1115 最大子段和(dp 贪心)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
?P1115 最大子段和
題目描述
給出一段序列,選出其中連續且非空的一段使得這段和最大。
輸入輸出格式
輸入格式:
?
輸入文件maxsum1.in的第一行是一個正整數N,表示了序列的長度。
第2行包含N個絕對值不大于10000的整數A[i],描述了這段序列。
?
輸出格式:
?
輸入文件maxsum1.out僅包括1個整數,為最大的子段和是多少。子段的最小長度為1。
?
輸入輸出樣例
輸入樣例#1:7 2 -4 3 -1 2 -4 3 輸出樣例#1:
4
說明
【樣例說明】2 -4 3 -1 2 -4 3
【數據規模與約定】
對于40%的數據,有N ≤ 2000。
對于100%的數據,有N ≤ 200000。
?
可以看出來是一道dp題,轉移方程很好找, f[i] = max(f[i-1], 0) + a[i]
邊界條件是f[0] = 0 為什么要和0作比較,因為如果比0小,那么這個字段和活著也是挺失敗的,不如重修2333
AC①: dp(48ms)
1 #include <cstdio> 2 #include <algorithm> 3 4 int a[200005]; 5 int f[200005]; 6 7 int main() 8 { 9 int n; 10 scanf("%d", &n); 11 for(int i=1; i<=n; i++) 12 scanf("%d", &a[i]); 13 14 for(int i=1; i<=n; i++) 15 f[i] = std::max(f[i-1], 0) + a[i]; 16 17 int maxx = -1234567; 18 for(int i=1; i<=n; i++) 19 if(f[i] > maxx) 20 maxx = f[i]; 21 22 printf("%d", maxx); 23 return 0; 24 }?
?
還可以用貪心的思路做
AC②: (貪心 36ms)
1 #include <cstdio> 2 3 int main() 4 { 5 int n, a, b, maxx; 6 scanf("%d", &n); 7 b = maxx = -1234567; // b表示前幾個字段和最大值 8 for(int i=1; i<=n; i++) 9 { 10 scanf("%d", &a); 11 if(b < 0) b = a; // 如果b<0 那么不如直接重開 12 else b += a; // b>=0 說明前面的字段和比較大 可以繼續加下去 13 if(b > maxx) maxx = b; 14 } 15 printf("%d", maxx); 16 return 0; 17 }?
轉載于:https://www.cnblogs.com/yBaka/p/7397260.html
總結
以上是生活随笔為你收集整理的Luogu P1115 最大子段和(dp 贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QT--2D绘图
- 下一篇: cocos2d-x 2.2 创建项目