hdu 1024 Max Sum Plus Plus 最大m个子序列
来源:互联网 发布:什么时候跑步最好知乎 编辑:程序博客网 时间:2024/06/05 20:31
传送门: http://acm.hdu.edu.cn/showproblem.php?pid=1024
- 题意
最大m个子序列 - dp
dp[divid][now] = max(dp[divid-1][1~now-1], dp[divid-1][now-1])+array[now]; - 解释:
now 是选择第 now 个, divid 是前 now 个分为 divid 个序列. - 数据范围 1e6
dp[1e6][1e6] == mle - 降维
降维真不是人干的活2333333
发现每一个元素只用了几次, 有贡献的永远是最大值, 所以开个tmax记录当前divid的max, 滚动下
不清楚为啥divid = 1 的时候会wa, 大概是写挫了, 懒得改于是divid = 1 特判好了
#include <stdio.h>#include <iostream>#include <cstring>using namespace std;const int MAX = 1e6+10;const long long INF = 1e15+10;long long dp[MAX], ary[MAX], n, m, itor, tmax, nxt, last, ans;long long mmax (long long a, long long b) { return a > b ? a : b;} bool getin() { if (scanf("%lld%lld", &m, &n) == 2) { for (int i = 0; i < n; ++i) scanf("%lld", ary+i); memset (dp, 0, sizeof(dp)); return true; } return false;}void judge() { for (int divid = 1; divid <= m; ++divid) { for (int now = divid-1; now < n; ++now) { if (divid == 1) { if (!now) tmax = mmax(0, ary[0]), dp[now] = ary[0]; else dp[now] = mmax(dp[now-1]+ary[now], ary[now]); } else { if (now == divid-1) tmax = dp[now-1]; nxt = mmax(tmax, dp[now]); dp[now] = mmax(tmax, dp[now-1])+ary[now]; tmax = nxt; }// printf("%cdp[%d] = %lld", "\n "[(bool)(now-divid+1)], now, dp[now]); } } ans = -INF; for (int i = m-1; i < n; ++i) ans = mmax(ans, dp[i]); printf("%lld\n", ans);}int main() { freopen("in.t", "r", stdin); freopen("out.t", "w", stdout); while( getin()) { judge(); } return 0;}
2017-09-06
阅读全文
0 0
- hdu 1024 Max Sum Plus Plus 最大m个子序列
- hdu1024 最大M个子段和 Max Sum Plus Plus
- hdu 1024 Max Sum Plus Plus(最大m段子序列和)
- hdoj 1024 Max Sum Plus Plus(m个子段最大和)
- hdu Max Sum Plus Plus(最大m段子段和)
- hdu Max Sum Plus Plus(最大m段子段和)
- HDU 1024 Max Sum Plus Plus(求m个不相交连续子序列最大和/01背包)
- Max Sum Plus Plus(m个子段的最大和)
- HDOJ 1024 Max Sum Plus Plus 最大M字段和
- hdu 1024 Max Sum Plus Plus(dp && 最大m子段和)
- hdu 1024 Max Sum Plus Plus 最大m子段和
- HDU 1024 最大m段子段和 Max Sum Plus Plus
- hdu 1024 Max Sum Plus Plus (最大m子段和)
- hdu 1024 Max Sum Plus Plus(最大M子段和)
- HDU 1024 Max Sum Plus Plus[dp](最大m子段和)
- hdu 1024 Max Sum Plus Plus(最大m子段和)
- hdu 1024 Max Sum Plus Plus(最大m子段和)
- HDU 1024 Max Sum Plus Plus((最大m段子段和))(动态规划经典)
- Golden.Software.Grapher.v12.7.855.Win32_64 1CD
- 虚拟机中除去虚拟网桥virbr0
- Shanghai 2006,UVaLive(LA) 3695 Distant Galaxy题解
- openlayers3 气泡框展示鼠标点击坐标
- android相关视频下载地址
- hdu 1024 Max Sum Plus Plus 最大m个子序列
- ZYNQ学习笔记(一): uboot 编译
- Ubuntu Tomcat服务器设置自动重启,定时检查崩溃后重启
- BFS & DFS的基础学习
- PAT (Basic Level) Practise (中文) 1037. 在霍格沃茨找零钱(20)
- Cocos2d-x里面如何实现MVC(四)
- Linux 中errno 错误对照表
- netsh 命令 -----承载网络配置
- 递归算法--如何一步一步理解递归(1)