zoukankan      html  css  js  c++  java
  • hdu 5586 Sum 基础dp

    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.(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
     
    Source
    题目链接:点击传送
    思路:基础dp;
       dp[i][0]表示dp前边没有改成f的总和
       dp[i][1]表示可以继续改成f的总和;
       dp[i][2]表示不可以继续改成f的总和;

    dp[i][0]=dp[i-1][0]+a[i];
    dp[i][1]=max(dp[i-1][1]+b[i],dp[i-1][0]+b[i]);
    dp[i][2]=max(dp[i-1][2]+a[i],dp[i-1][1]+a[i]);

       b=f(a);

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include<iostream>
    #include<cstdio>
    #include<cmath>
    #include<string>
    #include<queue>
    #include<algorithm>
    #include<stack>
    #include<cstring>
    #include<vector>
    #include<list>
    #include<set>
    #include<map>
    using namespace std;
    #define ll long long
    #define pi (4*atan(1.0))
    #define eps 1e-14
    #define bug(x)  cout<<"bug"<<x<<endl;
    const int N=1e5+30010,M=1e6+10,inf=2147483647;
    const ll INF=1e18+10,mod=2147493647;
    ll a[N],b[N],dp[N][4];
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            for(int i=1;i<=n;i++)
                scanf("%d",&a[i]),b[i]=(1890*a[i]+143)%10007;
            dp[0][0]=dp[0][1]=dp[0][2]=0;
            for(int i=1;i<=n;i++)
            {
                dp[i][0]=dp[i-1][0]+a[i];
                dp[i][1]=max(dp[i-1][1]+b[i],dp[i-1][0]+b[i]);
                dp[i][2]=max(dp[i-1][2]+a[i],dp[i-1][1]+a[i]);
            }
            printf("%lld
    ",max(dp[n][2],max(dp[n][0],dp[n][1])));
        }
        return 0;
    }
  • 相关阅读:
    面向对象-------------------------------面向对象的零散小知识
    面向对象------------------------------反射(面向对象的又一个思路)
    面向对象-------------------------对象和类的属性
    面向对象------------------一些双下方法
    装饰器搞一下
    字符串切片取值规则
    On The Way—Step 2 Python入门之Python内容初始
    socket对于recv函数的理解
    Socket通信原理学习
    [SUCTF 2019]Pythonginx
  • 原文地址:https://www.cnblogs.com/jhz033/p/6627345.html
Copyright © 2011-2022 走看看