原題連結
題解
1.選擇一個區間,然後加上其和的 \(c-1\) 倍,所以我們要選中區間和最大的那個
2.然而由於倍數可能為負,即 \(c<=0\) ,所以這時我們要儘可能選和小的
3.由於最多選一次,意味著也可以不選,所以dp的時候不選就可以賦零
code
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int main()
{
ll n,c;
cin>>n>>c;
if(c>0)//選0意味著減少,所以要儘可能選小的減少
{
ll sum=0,maxs=0,ans=0;
for(ll i=1;i<=n;i++)
{
ll x;
cin>>x;
if(sum+x<=0) sum=0;
else sum+=x;
maxs=max(maxs,sum);
ans+=x;
}
cout<<ans+maxs*(c-1);
}
else
{
ll sum=0,mins=0,ans=0;
for(ll i=1;i<=n;i++)
{
ll x;
cin>>x;
if(sum+x>=0) sum=0;
else sum+=x;
mins=min(mins,sum);
ans+=x;
}
cout<<ans+mins*(c-1);
}
return 0;
}