杭电1003动态规划

抄过来的学习下:

import java.util.Scanner;
/*
O(N^3)这中方法就是采用暴力法咯,把所有情况都列出来!假设我们要求i--j这段下标的序列和,i从1-n,j也从1-n,有因为求i--j求和要便利一遍,最好情况是只遍历一遍
最坏是遍历n次,折中也就是n/2,所以是O(n^3);
但是我们知道,i肯定要小于j的咯,所以我们就把j从i--n循环就可以了!这可以小小优化一下,
第三种方法就是动态规划了
f(x+1)=f(x)>=0?f(x)+a[i]:a[i];用我代码中变量表示就是sum=sum+data>=0?sum+data;data;这怎么理解呢?其实不难理解,就是如果当你的和小于0事舍去,如果sum是个负数
是个拖累data,那么我为什么还要带上sum呢?data独立不是更好的嘛!所以这就建立了方程式,OK我提交!OJ对你说"wrong answer",well well全场必须hold住,怎么回事呢?
自己写了几组测试数据,我们存在一个极端情况就是,要是所有的数据都是负数呢?那我们不是把所有数据都给丢掉了,所以必须注意这一组测试数据,如果所有的数据都是负
数,那么tempEnd就是只会静茹一次,是0,那么最后start会比end大, if(start>end)  end=start;这样就OK了,题目说了最小数值是-1000,所以我们max出事定义是位-1001
*/  
  
class Main  
{  
    public static void main(String args[])  
    {  
        Scanner keyIn = new Scanner(System.in);  
        while(keyIn.hasNext())  
        {  
        int iCase = keyIn.nextInt();  
        for(int i =1;i<=iCase;i++)  
        {  
            int n = keyIn.nextInt();  
            int sum =0;  
            int data;  
            int start=0;  
            int end=0;  
            int tempStart =0;  
            int tempEnd = 0;  
            int max = -1001;  
            for(int j=0;j<n;j++)  
            {  
                data = keyIn.nextInt();  
                if(sum>=0)  
                {  
                    sum+=data;  
                    tempEnd=j;  
                }  
                else  
                {  
                    sum=data;  
                    tempStart=j;  
                }  
                  
                if(max<sum)  
                {  
                    max = sum;  
                    start = tempStart;  
                    end = tempEnd;      
                }  
            }  
            System.out.println("Case "+i+":");  
            if(start>end)  
                end=start;  
            System.out.println(max+" "+(start+1)+" "+(end+1));  
            if(i!=iCase)  
          System.out.println();  
        }  
   }  
    }  
}
时间: 2024-10-08 09:58:00

杭电1003动态规划的相关文章

杭电 1003 Max Sum

http://acm.hdu.edu.cn/showproblem.php?pid=1003 Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 142781    Accepted Submission(s): 33242 Problem Description Given a sequence a[1],a[2],a[3

杭电1003(Max Sum) 首次dp

点击打开杭电1003 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14. Input The first line of the inp

杭电 1003

Max Sum Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 142647    Accepted Submission(s): 33192 Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max s

杭电1003 Max Sum 【连续子序列求最大和】

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目意思: 即给出一串数据,求连续的子序列的最大和 解题思路: 因为我们很容易想到用一个max来存放找到的子序列的和中的最大值,通过不断比较,对max的值进行更新,最后我们就能够得到最大子序列的和,于是很容易想到用暴力搜索,见上一篇博客,这样的时间复杂度为O(n^3),是超时的. 又因为想到只要一个数不是负数,不管它再小,加上去也是会使和变大的,所以我们需要用另一个变量来判断即将要加上的一个

杭电1003

1 #include<stdio.h> 2 3 int a[100005],dp[100005]; 4 5 int main() 6 { 7 int n,m,i,maxn,xx,yy,x,y,t; 8 while(~scanf("%d",&n)) 9 { 10 for(t=0; t<n; ++t) 11 { 12 scanf("%d",&m); 13 for(i=0; i<m; ++i) 14 scanf("%d&q

杭电1003 Max Sum TLE

这一题目是要求连续子序列的最大和,所以在看到题目的一瞬间就想到的是把所有情况列举出来,再两个两个的比较,取最大的(即为更新最大值的意思),这样的思路很简单,但是会超时,时间复杂度为O(n^3),因为有三重for语句 #include<stdio.h> #define maxn 101000 int main() { int ncase,flag=1,n,max,sum=0,h,z,a[maxn]; long i,j,k; scanf("%d",&ncase); wh

杭电1003 最大连续子串

6 -1 5 4 -7 #include<iostream> using namespace std; int main(){ int t,n,a,max,sum,start,end,temp; while(cin>>t){ for(int i=1;i<=t;i++){ cin>>n; max=-1001; temp=1; sum=0; for(int i=1;i<=n;i++){ cin>>a; sum+=a; if(max<sum){

HDU 4937 (杭电多校 #7 1003题)Lucky Number(瞎搞)

题目地址:HDU 4937 多校的题以后得重视起来...每道题都错好多次...很考察细节.比如这道....WA了无数次.... 这题的思路自己真心想不到...这题是将进制后的数分别是1位,2位,3位和更多位的分开来计算. 当是1位的时候,显然只有3到6,此时只能是-1 当是2位的时候,可以转换成一元一次方程求解 当是3位的时候,可以转换成一元二次方程求解 当是4位的时候,此时最多也只有7000个数,7000^3接近1e12.所以剩下的直接枚举进制数来判断即可. 代码如下: #include <i

杭电4826(动态规划)

Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,且只能向上向下向右走以前没有走过的格子,每一个格子中都有一些金币(或正或负,有可能遇到强盗拦路抢劫,度度熊身上金币可以为负,需要给强盗写欠条),度度熊刚开始时身上金币数为0,问度度熊走出迷宫时候身上最多有多少金币? Input 输入的第一行是一个整数T(T < 200),表示共有T组数据.每组数据的