码迷,mamicode.com
首页 > 其他好文 > 详细

kuangbin带我飞(基础dp)

时间:2020-10-31 02:32:13      阅读:13      评论:0      收藏:0      [点我收藏+]

标签:using   clu   type   相加   scanf   max   amp   eof   iostream   

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\n",Max[n]);
    }
}

kuangbin带我飞(基础dp)

标签:using   clu   type   相加   scanf   max   amp   eof   iostream   

原文地址:https://www.cnblogs.com/kksk/p/13904629.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!