• 最长子序列和问题


    分而治之:分区间计算每个区间的最大和

    #include <bits/stdc++.h>
    #define REP(i, a, b) for(int i = a; i < b; i++)
    #define REP_(i, a, b) for(int i = a; i <= b; i++)
    #define sl(n) scanf("%lld", &n);
    #define si(n) scanf("%d", &n);
    #define RepAll(a) for(auto x: a)
    #define cout(ans) cout << ans << endl;
    typedef long long ll;
    using namespace std;
    int find_maximum_subbarray(int *a,int left, int right)
    {
        if(left ==  right)
            return a[left];
    
            int mid = (left + right) >> 1;
            int left_sum = -0x3f3f3f3f;
            int sum = 0;
            int left_max, right_max;
    
            int lans = find_maximum_subbarray(a,  left,  mid);
            int rans = find_maximum_subbarray(a,  mid+1, right);
    
            for(int i = mid; i >= left; i--)
            {
                sum += a[i];
                if (sum > left_sum)
                {
                    left_sum = sum;
                    left_max = i;
                }
    
            }
            sum = 0;
            int right_sum = -0x3f3f3f3f;
            for(int i = mid+1; i <= right; i++)
            {
                sum += a[i];
                if (sum > right_sum)
                {
                    right_sum = sum;
                    right_max = i;
                }
            }
    
        int ans = left_sum + right_sum;
        if (lans > ans){
            ans = lans;
        }
        if (rans > ans){
            ans = rans;
        }
        return ans;
    }
    int main(){
        ll n;
        sl(n);
        int * a = new int [n];
        REP(i, 0, n){
            cin >> a[i];
        }
        cout << find_maximum_subbarray( a, 0, n-1);
    }

    题目:动态规划 dp

    #include <bits/stdc++.h>
    #define REP(i, a, b) for(int i = a; i < b; i++)
    #define REP_(i, a, b) for(int i = a; i <= b; i++)
    #define sl(n) scanf("%lld", &n);
    #define si(n) scanf("%d", &n);
    #define si(n) scanf("%d", &n);
    #define RepAll(a) for(auto x: a)
    #define cout(ans) cout << ans << endl;
    typedef long long ll;
    using namespace std;
    int main()
    {
        int n;
        si(n);
        int *a = new int [n];
        REP(i, 0, n)
        {
            cin >> a[i];
        }
        int ans = a[0];
        REP_(i, 1, n-1)
        {
            if(a[i - 1] > 0)
            {
                a[i] += a[i-1];
            }
            else
            {
                a[i] +=0;
            }
            if(a[i] > ans)
            {
                ans = a[i];
            }
        }
        cout << ans << endl;
        delete []a;
    }
    
  • 相关阅读:
    mysql修改数据表名
    HDU 5742 It's All In The Mind (贪心)
    HDU 5752 Sqrt Bo (数论)
    HDU 5753 Permutation Bo (推导 or 打表找规律)
    HDU 5762 Teacher Bo (暴力)
    HDU 5754 Life Winner Bo (博弈)
    CodeForces 455C Civilization (并查集+树的直径)
    CodeForces 455B A Lot of Games (博弈论)
    CodeForces 455A Boredom (DP)
    HDU 4861 Couple doubi (数论 or 打表找规律)
  • 原文地址:https://www.cnblogs.com/ygbrsf/p/12583012.html
Copyright © 2020-2023  润新知