NYOJ 44 子串和 (经典的dp问题)

在《计算机算法设计与分析》看到过其它的解法,不过还是用dp效率最高

时间限制:5000 ms  |  内存限制:65535 KB

难度:3

  • 描述
  • 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。
    • 输入
    • 第一行是一个整数N(N<=10)表示测试数据的组数)

      每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素。(0<n<=1000000)

    • 输出
    • 对于每组测试数据输出和最大的连续子串的和。
    • 样例输入
    • 1
      5
      1 2 -1 3 -2
    • 样例输出
    • 5
#include <iostream>
#include <climits>
#include <stdio.h>
#include <vector>

using namespace std;

int MaxSum(const vector<int> &v,const int &m)
{
    int i,lmax,tmax;
    lmax=-INT_MAX;
    tmax=0;
    for(i=0;i<m;i++)
    {
        tmax+=v[i];
        if(tmax>lmax)
            lmax=tmax;
        if(tmax<0)
            tmax=0;
    }
    return lmax;
}

int main()
{
    int n,m,i;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        vector<int> v(m);
        for(i=0;i<m;i++)
            scanf("%d",&v[i]);

        printf("%d\n",MaxSum(v,m));
    }
    return 0;
}

低效算法

#include <iostream>
#include <stdio.h>
#include <vector>

using namespace std;

int MaxSum(const vector<int> &v,const int &m)
{
    int i,j,lmax,tmax;
    lmax=0;
    for(i=0;i<m;i++)
    {
        tmax=0;
        for(j=i;j<m;j++)
        {
            tmax+=v[j];
            if(tmax>lmax)
                lmax=tmax;
        }
    }
    return lmax;
}

int main()
{
    int n,m,i,num;
    scanf("%d",&n);
    while(n--)
    {
        scanf("%d",&m);
        vector<int> v(m);
        for(i=0;i<m;i++)
        {
            scanf("%d",&num);
            v[i]=num;
        }

        printf("%d\n",MaxSum(v,m));
    }
    return 0;
}

标程

#include <iostream>
#include <climits>
#include <cstdio>

using namespace std;

int arrMax[1000000]={0};

int main()
{
    int n,m,i,max;
    scanf("%d",&n);
    while(n--)
    {
        max=-INT_MAX;
        scanf("%d",&m);
        for(i=1;i<=m;i++)
        {
            scanf("%d",&arrMax[i]);
            if(arrMax[i-1]>0)
                arrMax[i]+=arrMax[i-1];
            if(arrMax[i]>max)
                max=arrMax[i];
        }

        printf("%d\n",max);
    }
    return 0;
}
时间: 2024-11-05 18:42:47

NYOJ 44 子串和 (经典的dp问题)的相关文章

NYOJ 44 字串和 (最大字串和 线性dp)

题目链接: http://acm.nyist.edu.cn/JudgeOnline/problem.php?pid=44 子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n. 输入 第一行是一个整数N(N<=10)表示测试数据的组数) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个

NYOJ 1067 Compress String(区间dp)

Compress String 时间限制:2000 ms  |  内存限制:65535 KB 难度:3 描述 One day,a beautiful girl ask LYH to help her complete a complicated task-using a new compression method similar to Run Length Encoding(RLE) compress a string.Though the task is difficult, LYH is

NYOJ 44 字串和

子串和 时间限制:5000 ms  |  内存限制:65535 KB 难度:3 描述 给定一整型数列{a1,a2...,an},找出连续非空子串{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n. 输入 第一行是一个整数N(N<=10)表示测试数据的组数) 每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素.(0<n<=1000000) 输出 对于

poj 1947 经典树形dp

经典树形dp:问在一棵树上最少删除多少条边可以分离出一个节点数为p的子树. 定义状态: dp[i][j]表示从i为根的子树上分离出一个节点数为j的子树的代价(最少需要删除的边数). 考虑i节点的每个儿子ii,ii可以选或者不选(切断),然后就转化成了背包问题. dp[u][j] = min( dp[u][j], dp[u][j - k] + dp[v][k] ); 1 #include <iostream> 2 #include <cstring> 3 #include <c

nyoj 325 zb的生日 【DP】||【DFS】

两种方法: 第一种:将总数一半当做背包,用总数-2*最多能装的数目就是所求: 第二种:深搜: zb的生日 时间限制:3000 ms  |  内存限制:65535 KB 难度:2 描述 今天是阴历七月初五,acm队员zb的生日.zb正在和C小加.never在武汉集训.他想给这两位兄弟买点什么庆祝生日,经过调查,zb发现C小加和never都很喜欢吃西瓜,而且一吃就是一堆的那种,zb立刻下定决心买了一堆西瓜.当他准备把西瓜送给C小加和never的时候,遇到了一个难题,never和C小加不在一块住,只能

ZOJ3329之经典概率DP

One Person Game Time Limit: 1 Second      Memory Limit: 32768 KB      Special Judge There is a very simple and interesting one-person game. You have 3 dice, namely Die1, Die2 and Die3. Die1 has K1 faces. Die2 has K2 faces. Die3 has K3 faces. All the

POJ-1243 One Person (经典级dp

One Person Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 2122   Accepted: 1426 Description In the game show "The Price is Right", a number of players (typically 4) compete to get on stage by guessing the price of an item. The winn

poj3133之经典插头DP

Manhattan Wiring Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 1482   Accepted: 869 Description There is a rectangular area containing n × m cells. Two cells are marked with "2", and another two with "3". Some cells are

HDU 2196 Computer 经典树形DP

一开始看错题了,后来发现原来是在一颗带权的树上面求出距离每一个点的最长距离,做两次dfs就好,具体的看注释? #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #incl