hdu1003 dp 最大子数组

dp经典题,这题一年前就做过了,主要在确定begin和end有技巧,题目要求输出第一个sub,所以begin要尽量左移,end尽量右移

#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <string>
const int MAXN = 1E5+10;
using namespace std;

int dp[MAXN];

int main()
{
    int t,myc=1;
    scanf("%d",&t);
    while(t--){
        int n;
        scanf("%d",&n);
        for(int i=0;i<n;i++){
            scanf("%d",&dp[i]);
        }

        int l,r,temp,maxt=dp[0];
        l = r = temp = 0;
        for(int i=1;i<n;i++){
            if(dp[i-1]<0){temp = i;} //重新设置起始节点
            dp[i] += max(0,dp[i-1]);
            if(maxt<dp[i]){
                maxt = dp[i];
                l = temp;
                r = i;
            }
        }

        cout<<"Case "<<myc++<<":"<<endl;
        cout<<maxt<<" "<<l+1<<" "<<r+1<<endl;
        if(t)cout<<endl;

    }

    return 0;
}

时间: 2024-11-03 01:35:34

hdu1003 dp 最大子数组的相关文章

蚂蚁的难题(二)首尾相连数组的最大子数组和(DP)

蚂蚁的难题(二) 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 下雨了,下雨了,蚂蚁搬家了. 已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈.小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌 这种食材.因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材.时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大. 输入 有多组测试数据(以EOF结尾). 每组数据有两行,第一行有一个n,表示有n种食材排成了一个圈

(算法)最大子数组和以及最大子矩阵和

题目: 1.给定一数组,求该数组的最大子数组和: 2.给定一矩阵,求该矩阵的最大子矩阵和: 思路: 1.求数组的最大子数组和很简单,可以通过动态规划来实现,假设数组为arr: 假设dp[i]表示从0到i的数组的最大子数组和,那么递推关系式表示为: dp[0]=arr[0]; dp[i]=dp[i-1]>0?dp[i-1]+arr[i]:arr[i] 2.求矩阵的最大子矩阵和看似很难,其实也可以转化为最大子数组和的问题.假设矩阵为matrix 首先,我们求出矩阵每个位置按行叠加的结果,设叠加结果矩

最大子数组和(最大子段和)

比如对于数组[1,-2,3,5,-1,2] 最大子数组和是sum[3,5,-1,2] = 9, 我们要求函数输出子数组和的最大值,并且返回子数组的左右边界(下面函数的left和right参数). 本文我们规定当数组中所有数都小于0时,返回数组中最大的数(也可以规定返回0,只要让以下代码中maxsum初始化为0即可,此时我们要注意-1 0 0 0 -2这种情形,特别是如果要求输出子数组的起始位置时,如果是面试就要和面试官问清楚) 以下代码我们在PAT 1007. Maximum Subsequen

lintcode 最大子数组III

题目描述 给定一个整数数组和一个整数 k,找出 k 个不重叠子数组使得它们的和最大.每个子数组的数字在数组中的位置应该是连续的. 返回最大的和. 注意事项 子数组最少包含一个数 样例 给出数组 [-1,4,-2,3,-2,3] 以及 k = 2,返回 8 思路 dp[i][j] = max(dp[x][j-1]+maxs[x+1][i]) dp[i][j] 表示前 i 个数中 j 个子数组的最大值, maxs[i][j] 表示 第i个数到第j个数中最大子数组的和. 代码 public class

返回一个整数数组中最大子数组的和(环)

要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1], …… A[n-1], A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值.要求时间复杂度为O(n). 思路: 结对开发:张子超 马思勉 刚看到这个题目首先想到的是将随机产生的数组复制一遍放在原数组后面,然后再进行求解,后来在和马思勉的探讨中得到新的解决思路,首先按照求解整数数组方法,

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1.动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列.如果序列比较长,这种方法需要指数级时间,不切实际. LCS的最优子结构定理:设X={x1,x2,……,xm}和Y={y1,y2,……,yn}为两个序列,并设Z={z1.z2.……,zk}为X和Y的任意一个LCS,则: (1)如果xm=

求最大子数组02

题目:整数数组中最大子数组的和 要求: 输入一个整形数组,数组里有正数也有负数. 数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 如果数组A[0]……A[j-1]首尾相邻,允许A[i-1],…… A[n-1],A[0]……A[j-1]之和最大. 同时返回最大子数组的位置. 求所有子数组的和的最大值. 这次任务多了一个要求就是这个数组是环形的, 也就是可以从A[i-1],…… A[n-1],A[0],A[1]这样的数组也阔以,那么首先想到的就是循环链表,然后控制求和的子数组长度即

最大子数组之和 2

题目:返回一个整数数组中最大子数组的和 要求:(在原有代码上进行迭代) 1.输入一个整数数组,数组中有正数和负数. 2.数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和. 3.如果数组a[0]……a[n-1]首尾相邻,允许a[i-1]……a[n-1].a[0]……a[j-1]之和最大. 4.同时返回最大子数组的位置. 5.求所有子数组的和的最大值. 分析: 在本次编写的代码中使用了可变数组vector,它与一般数组作为函数参数不同,当vecto作为函数的参数时,在声明或定义函数时,

最大子数组和2.0

//求最大子数组和 张鹏宇 武于微 /**************************************************************** 题目要求: 用户输入整数组,首尾相接,寻找最大子数组,求出其和,并返回子数组位置 思路: 用户随机输入num个整数(num由用户确定),存入数组number[][] 用循环实现二维数组转化,目的是实现数组收尾相接,找出最大子数组 用两个循环实现寻找每一个整数作为初始值得最大子数组,并将结果存入CMax[] 最后输出CMax中的最大