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(l≤i≤r)
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.(1≤n≤105)
Next line contains n integers A1,A2....An .(0≤Ai≤104)
It's guaranteed that ∑n≤106 .
First line of each case contains a single integer n.(1≤n≤105)
Next line contains n integers A1,A2....An .(0≤Ai≤104)
It's guaranteed that ∑n≤106 .
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\n",sun+Max); } return 0; }