• hdu 5586 Sum【dp最大子段和】


    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5586

    Sum

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 677    Accepted Submission(s): 358


    Problem Description
    There is a number sequence A1,A2....An ,you can select a interval [l,r] or not,all the numbers Ai(lir) will become f(Ai) .f(x)=(1890x+143)mod10007 .After that,the sum of n numbers should be as much as possible.What is the maximum sum?
     
    Input
    There are multiple test cases.
    First line of each case contains a single integer n.(1n105)
    Next line contains n integers A1,A2....An .(0Ai104)
    It's guaranteed that n106 .
     
    Output
    For each test case,output the answer in a line.
     
    Sample Input
    2
    10000 9999
    5
    1 9999 1 9999 1
     
    Sample Output
    19999
    22033
     
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include<algorithm>
    #define MAX 100000
    #define LL long long
    using namespace std;
    LL fun(LL x)
    {
    	return ((1890*x)%10007+143%10007)%10007;
    }
    int main()
    {
    	int n,m,j,i,k;
    	int s[MAX],a[MAX],b[MAX];
    	while(scanf("%d",&n)!=EOF)
    	{
    		int sun=0;
    	    for(i=1;i<=n;i++)
    	    {
    	    	scanf("%d",&s[i]);
    	    	a[i]=fun(s[i]);//储存 f(x); 
    	    	b[i]=a[i]-s[i];//储存f(x)和x的差值 
    	    	sun+=s[i];
    	    }	
    	    int sum=0;
    	    int Max=0;
    	    for(i=1;i<=n;i++)//最大子段和代码 
    	    {
    	    	if(sum<=0)
    	    	sum=b[i];
    	    	else
    	    	sum+=b[i];
    	    	Max=max(Max,sum);//求出最大子段 
    	    }
    	    printf("%d
    ",sun+Max);
    	}
    	return 0; 
    }
    

      

  • 相关阅读:
    Java_适配器模式
    linux常用命令整理
    (转)使用隐藏的iframe 隐藏form提交,仿AJax无刷新提交,可以实现无刷新上传文件
    mysql添加并返回主键
    学习RMI
    关于bcprov-jdk16
    JavaScript在页面中的引用方法
    通过CFX发布WebService(一)
    字符串和json数据的转换
    MD5 加密与解密
  • 原文地址:https://www.cnblogs.com/tonghao/p/5019161.html
Copyright © 2020-2023  润新知