FZU 2253 DP(最大子段和變形)

2021-08-04 02:32:54 字數 601 閱讀 2591

給出一串01序列,現在要選擇乙個區間[l,r]翻轉,求得反轉之後的序列包含的1最多有多少個。

最大子段和的變形。

設dp[i]表示以位置i為反轉終點最多有1的個數,那麼一共只有兩種可能,要麼從之前的最大值轉移過來,要麼從i點開始翻轉,並加上i-1之前的字首和,因此可以得出方程:

dp[i] = max(dp[i - 1] + !a[i], sum[i - 1] + !a[i])

其中!a[i]表示a[i]取反,1變成0,0變成1

#include 

#include

#include

using

namespace

std;

const

int maxn = 1e5 + 10;

int a[maxn], sum[maxn], dp[maxn];

int main()

dp[0] = 0;

int ans = 0;

for (int i = 1; i <= n; i++)

printf("%d\n", ans);

}return

0;}

最大子段和 (dp

n個整數組成的序列a1,a2,a3,ann,求該序列如ai ai 1 aj的連續子段和的最大值。當所給的整數均為負數時和為0。例如 2,11,4,13,5,2,和最大的子段為 11,4,13。和為20。第1行 整數序列的長度n 2 n 50000 第2 n 1行 n個整數 10 9 ai 10 9 ...

dp 最大子段和

注意 在實際問題中可能題目要求至少選乙個,可能可以乙個都不選 只返回最大子段和 include include using namespace std const int maxn 2e5 10 const int inf 0x7fffffff int n int a maxn int maxsum...

最大子段和(dp)

最基礎的的最大子段和,設dp i dp i dp i 為以num i num i num i 結尾的最大子段和,有dp i m ax d p i 1 n um i nu m i dp i max dp i 1 num i num i dp i max dp i 1 num i n um i 最終結果...