kuangbin带我飞(基础dp)
Posted kksk
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了kuangbin带我飞(基础dp)相关的知识,希望对你有一定的参考价值。
kuangbin带我飞(基础dp)
(dp[i][j])为前j个数将其j为其中一组,分为i组每组相加的和
这状态转移方程为(:dp[i][j]=max(dp[i][j-1]+a[i],max(dp[i-1][k])+a[i]))
其中(k<=j-1),
复杂度为(O(mn^{2})),显然算法超时。
我们可以对(max(dp[i-1][k]))把这层优化掉,即用Max[j]来前j个数分成i组最大的和。
最后状态转移方程为(:d[j]=max(dp[j-1]+a[i]+Max[j-1]+a[i]))
代码如下(:)
#include <iostream>
using namespace std;
typedef long long ll;
int m,n;
ll a[1000007],dp[1000007],Mx[1000007],Max[1000007];
int main(){
while(scanf("%d %d",&m,&n)!=EOF){
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
for(int i=0;i<=n;i++){
dp[i]=Max[i]=0;
Mx[i]=-1e18;
}
for(int i=1;i<=m;i++){
for(int j=i;j<=n;j++){
dp[j]=max(dp[j-1]+a[j],Max[j-1]+a[j]);
Mx[j]=max(dp[j],Mx[j-1]);
}
for(int j=i;j<=n;j++){
Max[j]=Mx[j];
Mx[j]=-1e18;
}
}
printf("%lld
",Max[n]);
}
}
以上是关于kuangbin带我飞(基础dp)的主要内容,如果未能解决你的问题,请参考以下文章