hdu 1024 Max Sum Plus Plus dp
来源:互联网 发布:宝玉宝钗圆房知乎 编辑:程序博客网 时间:2024/05/17 03:27
题意:输入m和n,给出一个n长数字序列。问m个不交叉连续段之和最大为多少。
题解:
dp[i][j]表示前j个序列数字,找出i段,且a[j]包含在段内时,最大的和。则:
dp[i][j]=max(dp[i][j-1]+a[j],max(dp[i-1][k])+a[j])(0<k<j);
由于如果用c[j-1]=max(dp[i-1][k]),那么max(dp[i][k])=max(c[j-1],dp[i][j-1])。从而dp[i][j]只与前一行和本行前面的数有关,继而得到
dp[j]=max(dp[j-1]+a[j],c[j-1]+a[j]);//dp[j-1]已经被更新过,相当于dp[i][j-1],而c[j-1]在这之前不能被更新,之后立马更新
代码:
#include <cstdio>#include <cstring>#include <cmath>#include <string>#include <queue>#include <iostream>#include <algorithm>using namespace std;const int maxn=1e6+10;const int INF=1e8;int dp[maxn];int a[maxn];int c[maxn];int main(){ int m,n; while(scanf("%d%d",&m,&n)!=EOF) { int i,j,k,ans; for(i=1;i<=n;i++) { scanf("%d",&a[i]); c[i]=dp[i]=0; } c[0]=dp[0]=0; for(i=1;i<=m;i++) { ans=-INF; for(j=i;j<=n;j++) { dp[j]=max(dp[j-1]+a[j],c[j-1]+a[j]); c[j-1]=ans; ans=max(ans,dp[j]); } } printf("%d\n",ans); } return 0;}
0 0
- hdu 1024 Max Sum Plus Plus--DP
- hdu 1024 Max Sum Plus Plus(dp)
- hdu-1024-Max Sum Plus Plus-DP
- hdu 1024 Max Sum Plus Plus(dp)
- hdu 1024 Max Sum Plus Plus dp
- HDU DP - 1024 Max Sum Plus Plus
- HDU 1024 Max Sum Plus Plus【DP】
- HDU 1024 Max Sum Plus Plus(DP)
- HDU 1024 Max Sum Plus Plus DP
- HDU 1024 Max Sum Plus Plus DP *
- HDU-1024 Max Sum Plus Plus(dp)
- 【hdu 1024】Max Sum Plus Plus dp
- HDU-1024 Max Sum Plus Plus(DP)
- hdu 1024 Max Sum Plus Plus(dp)
- 【HDU 1024 Max Sum Plus Plus】+ dp
- HDU Max Sum Plus Plus DP
- hdu 1024 Max Sum Plus Plus(DP最大字段和)
- HDU 1024 Max Sum Plus Plus DP中的经典
- service()和doGet()和doPost()
- Android 弹无虚发之第三弹:ActionBar 更换背景、颜色、文字,自定义主题Style
- 人生第一条线段树!!!!FLY 1427: RMQ 两数之间最小值
- 视图控制器
- cocos2d-x 3.0 Android环境搭建(亲测通过)
- hdu 1024 Max Sum Plus Plus dp
- 我给不了你梦中情人,至少还有硬盘女神:hardseed
- Uva-1336-Fixing the Great Wall
- Android消息推送完美方案[转]
- 使用API失效供应商地址Demo
- hdu3234 带权并查集(XOR)
- android slidingmenu滑动菜单(完全版)
- POJ 1364 King(差分约束系统)
- m进制转十进制