码迷,mamicode.com
首页 > 其他好文 > 详细

hdu-5586 Sum(dp)

时间:2016-06-17 14:23:04      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:

题目链接:

Sum

Time Limit: 2000/1000 MS (Java/Others)  

  Memory Limit: 65536/65536 K (Java/Others)


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.(1n10^5)
Next line contains n integers A1,A2....An.(0Ai10^4)
It‘s guaranteed that n10^6.
 

 

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
 
 
题意:
 
给一个数组,选一个区间[l,r]把a[i]变成f(a[i]),也可以不选,问最后得到的这个数组的和最大是多少;
 
思路:
 
p[i]=(1890*a[i]+143)%10007;
然后就是在p[i]中找一个连续喝最大的字串,然后就好了;水题;
 
AC代码:
//#include <bits/stdc++.h>
#include <vector>
#include <iostream>
#include <queue>
#include <cmath>
#include <map>
#include <cstring>
#include <algorithm>
#include <cstdio>

using namespace std;
#define Riep(n) for(int i=1;i<=n;i++)
#define Riop(n) for(int i=0;i<n;i++)
#define Rjep(n) for(int j=1;j<=n;j++)
#define Rjop(n) for(int j=0;j<n;j++)
#define mst(ss,b) memset(ss,b,sizeof(ss));
typedef long long LL;
template<class T> void read(T&num) {
    char CH; bool F=false;
    for(CH=getchar();CH<0||CH>9;F= CH==-,CH=getchar());
    for(num=0;CH>=0&&CH<=9;num=num*10+CH-0,CH=getchar());
    F && (num=-num);
}
int stk[70], tp;
template<class T> inline void print(T p) {
    if(!p) { puts("0"); return; }
    while(p) stk[++ tp] = p%10, p/=10;
    while(tp) putchar(stk[tp--] + 0);
    putchar(\n);
}

const LL mod=1e9+7;
const double PI=acos(-1.0);
const LL inf=1e14;
const int N=1e4+15;
const int maxn=18;

int p[10*N],a[10*N];
LL dp[10*N];
int main()
{
    int n;
    while(cin>>n)
    {
        LL sum=0,ans=0;
        Riep(n)read(a[i]),p[i]=(1890*a[i]+143)%10007-a[i],sum=sum+a[i];
        dp[0]=0;
        for(int i=1;i<=n;i++)
        {
            if(dp[i-1]+p[i]<0)dp[i]=0;
            else dp[i]=dp[i-1]+p[i];
            ans=max(ans,dp[i]);
        }
        cout<<sum+ans<<"\n";
    }

        return 0;
}

 

 
 

hdu-5586 Sum(dp)

标签:

原文地址:http://www.cnblogs.com/zhangchengc919/p/5593733.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!