poj2479(子串和变形,DP)
来源:互联网 发布:cyberduck for mac 编辑:程序博客网 时间:2024/06/05 22:41
题目链接:poj2479
话说,一开始是用线段树A的。。。。。
/*题意:求数列中两个不重叠的子序列的最大和。思路:先从左向右求最大子串和(d1表示),然后再从右向左求最大子串和(d2表示)然后遍历d1,记录1~i之间的最大值left,比较left和d2[i+1]的最大值*/#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define lson rt<<1#define rson rt<<1|1const int inf = 0x3f3f3f3f;const int N = 50005;int d1[N],d2[N],a[N];int main(){ int T,i,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i = 1; i <= n; i ++) scanf("%d",&a[i]); memset(d1, 0, sizeof(d1)); memset(d2, 0, sizeof(d2)); for(i = 1; i <= n; i ++)//从左向右求最大子串和 d1[i] = max(a[i], a[i]+d1[i-1]); for(i = n; i >= 1; i --)//从右向左求最大子串和 d2[i] = max(a[i], a[i]+d2[i+1]); int ans = -inf, left = -inf; for(i = 1; i < n; i ++){ left = max(left, d1[i]); ans = max(ans, left+d2[i+1]); } printf("%d\n",ans); } return 0;}
线段树代码:
#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define lson rt<<1#define rson rt<<1|1const int inf = 0x3f3f3f3f;const int N = 50005;int d1[N],d2[N],a[N];struct node{ int l,r; int num;}s[N<<2];void build(int l, int r, int rt){ s[rt].l = l; s[rt].r = r; s[rt].num = -inf; if(l == r){ s[rt].num = d2[l]; return; } int mid = (l + r) >> 1; build(l, mid, lson); build(mid+1, r, rson); s[rt].num = max(s[lson].num, s[rson].num);}int query(int l, int r, int rt){ if(l <= s[rt].l && s[rt].r <= r) return s[rt].num; int mid = (s[rt].l + s[rt].r) >> 1; int ans = -inf; if(l <= mid) ans = max(ans, query(l, r, lson)); if(mid < r) ans = max(ans, query(l, r, rson)); return ans;}int main(){ int T,i,n; scanf("%d",&T); while(T--) { scanf("%d",&n); for(i = 1; i <= n; i ++) scanf("%d",&a[i]); memset(d1, 0, sizeof(d1)); memset(d2, 0, sizeof(d2)); for(i = 1; i <= n; i ++) d1[i] = max(a[i], a[i]+d1[i-1]); for(i = n; i >= 1; i --) d2[i] = max(a[i], a[i]+d2[i+1]); build(1, n, 1); int ans = -inf; for(i = 1; i < n; i ++){ int num = query(i+1, n, 1);//在d2中查询i+1~n间的最大值 ans = max(ans, num+d1[i]); } printf("%d\n",ans); } return 0;}
0 0
- poj2479(子串和变形,DP)
- poj2479 Maximum sum(最大子段和变形)
- POJ2479 DP 双向求子序列的和
- POJ2479 最大子段和
- hdu 5280(最大子串和变形,dp)
- POJ2479 Maximum sum【两边最大子串和】
- poj2479(DP)
- POJ2479 DP
- POJ2479 POJ1050 最大和子段
- POJ2479 Maximum sum 最长连续子序列[DP]
- 最大子段和 (含变形)【dp】
- FZU 2253 DP(最大子段和变形)
- 动态规划 POJ2479与POJ2593 最大子段和
- 【动态规划(最大子序列和)】:poj2479,Maximum sum
- POJ2479 第一次的DP....
- POJ2479 Maximum sum DP
- POJ2479【线性DP】
- hdu1081 最大子矩阵和(DP动态规划 最大子序列和变形题)
- 网页宽度自动适应手机屏幕宽度的方法
- iOS 7 交互式过渡
- 致命的错误:python中误输入tab键
- lock wait timeout exceeded try restarting transaction mysql
- boost 编译命令
- poj2479(子串和变形,DP)
- pthread_exit()
- An association from the table * refers to an unmapped class: *
- 有好多的非处女们确实让大家反感,知道为什么吗?其实你们应该检讨下自己!
- centOS命令随笔(1)-date,cal,ls
- Ubuntu下的OpenERP负载均衡实例
- Android中SQLite应用详解
- error4430, errro2419 error C2182等win: 错误,加window.h 头文件即可
- 《逆袭大学》文摘——9.1 一切让代码行数说话