Codeforces_327A(前缀+区间DP)
Posted 偶尔爆零的蒟蒻
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces_327A(前缀+区间DP)相关的知识,希望对你有一定的参考价值。
题意
给定一个序列,只有01,必须选定一个区间取反,求最多有几个1
找到一个区间(0的个数减1的个数之差最大),加上之前的的1个数即可
//#pragma GCC optimize(2)
//#pragma GCC optimize(3,"Ofast","inline")
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
using namespace std;
#define ff first
#define ss second
#define ms(x) memset(x,0,sizeof(x))
typedef long long ll;
typedef pair<int,int> pii;
#define inf 0x3f3f3f3f //10 6110 9567<2^30=10 7374 1824
#define iinf 0x7fffffff //
const int mod=1e9+7;
const int MAX=1e5;
int dp[101][101];
int a[101];
int sum0[101];
int sum1[101];
//第一感觉区间dp,找到一个区间,其0、1个数差最大
//凭感觉AC了,很开心
int main()
ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);
int n,c=0;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
sum0[i]=sum0[i-1];//前缀0个数
sum1[i]=sum1[i-1];//前缀1个数
if(!a[i])sum0[i]++;
else
c++;
sum1[i]++;
for(int k=0;k<n;k++)
for(int i=1;i+k<=n;i++)
int j=i+k;
for(int r=i;r<=j;r++)
dp[i][j]=max(max(dp[i+1][r],dp[i][r]),sum0[j]-sum0[i-1]-sum1[j]+sum1[i-1]);
if(n==c)cout<<n-1;//特判全1
else cout<<c+dp[1][n];
以上是关于Codeforces_327A(前缀+区间DP)的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces1312E Array Shrinking 区间DP
Codeforces 332B Maximum Absurdity(DP+前缀和处理)
CodeForces 327E Axis Walking(状压DP+卡常技巧)
Codeforces 934C - A Twisty Movement
[区间DP] Tinkoff Challenge - Elimination Round D题
Codeforces Round #635 (Div. 2) E——Kaavi and Magic Spell 区间dp