zoukankan      html  css  js  c++  java
  • CodeForces 446A DZY Loves Sequences (DP+暴力)

    题意:给定一个序列,让你找出一个最长的序列,使得最多改其中的一个数,使其变成严格上升序列。

    析:f[i] 表示以 i 结尾的最长上升长度,g[i] 表示以 i 为开始的最长上升长度,这两个很容易就求得,最后枚举中间值即可。

    代码如下:

    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <cstdio>
    #include <string>
    #include <cstdlib>
    #include <cmath>
    #include <iostream>
    #include <cstring>
    #include <set>
    #include <queue>
    #include <algorithm>
    #include <vector>
    #include <map>
    #include <cctype>
    #include <cmath>
    #include <stack>
    #define lson l,m,rt<<1
    #define rson m+1,r,rt<<1|1
    //#include <tr1/unordered_map>
    #define freopenr freopen("in.txt", "r", stdin)
    #define freopenw freopen("out.txt", "w", stdout)
    using namespace std;
    //using namespace std :: tr1;
    
    typedef long long LL;
    typedef pair<int, int> P;
    const int INF = 0x3f3f3f3f;
    const double inf = 0x3f3f3f3f3f3f;
    const LL LNF = 0x3f3f3f3f3f3f;
    const double PI = acos(-1.0);
    const double eps = 1e-8;
    const int maxn = 1e5 + 5;
    const LL mod = 10000000000007;
    const int N = 1e6 + 5;
    const int dr[] = {-1, 0, 1, 0, 1, 1, -1, -1};
    const int dc[] = {0, 1, 0, -1, 1, -1, 1, -1};
    const char *Hex[] = {"0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111"};
    inline LL gcd(LL a, LL b){  return b == 0 ? a : gcd(b, a%b); }
    int n, m;
    const int mon[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    const int monn[] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
    inline int Min(int a, int b){ return a < b ? a : b; }
    inline int Max(int a, int b){ return a > b ? a : b; }
    inline LL Min(LL a, LL b){ return a < b ? a : b; }
    inline LL Max(LL a, LL b){ return a > b ? a : b; }
    inline bool is_in(int r, int c){
        return r >= 0 && r < n && c >= 0 && c < m;
    
    }
    int f[maxn], g[maxn], a[maxn];
    
    int main(){
        while(scanf("%d", &n) == 1){
            a[0] = 0;
            memset(f, 0, sizeof f);
            memset(g, 0, sizeof g);
            for(int i = 1; i <= n; ++i)  scanf("%d", a+i);
            f[0] = 0;  f[1] = 1;
            for(int i = 2; i <= n; ++i)
                if(a[i] > a[i-1]) f[i] = f[i-1] + 1;
                else f[i] = 1;
            g[n] = 1;
            for(int i = n-1; i > 0; --i)
                if(a[i] < a[i+1]) g[i] = g[i+1] + 1;
                else g[i] = 1;
            int ans = 0;
            for(int i = 1; i <= n; ++i){
                ans = Max(ans, f[i]+g[i]-1);
                if(i < n) ans = Max(ans, f[i]+1);
                if(i > 1) ans = Max(ans, g[i]+1);
                if(i > 1 && a[i] > a[i-1])  ans = Max(ans, f[i-1]+g[i]);
                if(i < n && a[i] < a[i+1])  ans = Max(ans, f[i]+g[i+1]);
                if(i > 1 && i < n && a[i+1] - a[i-1] > 1)  ans = Max(ans, f[i-1]+g[i+1]+1);
            }
            printf("%d
    ", ans);
        }
        return 0;
    }
    
  • 相关阅读:
    【leetcode】1365. How Many Numbers Are Smaller Than the Current Number
    【leetcode】1363. Largest Multiple of Three
    【leetcode】1362. Closest Divisors
    【leetcode】1361. Validate Binary Tree Nodes
    【leetcode】1360. Number of Days Between Two Dates
    【leetcode】1359. Count All Valid Pickup and Delivery Options
    【leetcode】1357. Apply Discount Every n Orders
    【leetcode】1356. Sort Integers by The Number of 1 Bits
    ISE应用入门的一些问题
    DDR的型号问题
  • 原文地址:https://www.cnblogs.com/dwtfukgv/p/5977654.html
Copyright © 2011-2022 走看看