zoukankan      html  css  js  c++  java
  • leetcode

    目录

    leetcode刷题小结

    730 统计不同回文子字符串(DP)

    如果 S[i] == S[j],这时我们需要判断[i, j]这一段中有多少字符与S[i]不相等
    如果中间没有和S[i]相同的字母,
    例如"aba"这种情况,dp[i][j] = dp[i + 1][j - 1] * 2 + 2;
    如果中间只有一个和S[i]相同的字母,
    就是"aaa"这种情况,dp[i][j] = dp[i + 1][j - 1] * 2 + 1;
    否则中间至少有两个和S[i]相同的字母,
    就是"aabaa"这种情况,dp[i][j] = dp[i + 1][j - 1] * 2 - dp[left + 1][right - 1];
    否则dp[i][j] = dp[i][j - 1] + dp[i + 1][j] - dp[i + 1][j - 1];
    时间复杂度:(O(n^2*log(n))),但是在leetcode上跑的比(O(n^3))还慢,数据太水了。

    class Solution {
    public:
        int countPalindromicSubsequences(string S) {
            int len = S.length(), i = 0, mod = 1000000007;
            vector<vector<int>> dp(len, vector<int>(len, 0));
            vector<vector<int>> pos(4);
            for(char c: S) {
                pos[c-'a'].emplace_back(i);
                dp[i][i] = 1;
                ++ i;
            }
            for(int d = 2; d <= len; ++d) {
                for(i = 0; i + d - 1 < len; ++i) {
                    int j = i + d - 1;
                    if(S[i] == S[j]) {
                        int left = upper_bound(begin(pos[S[i]-'a']), end(pos[S[i]-'a']), i) - begin(pos[S[i]-'a']);
                        int right = prev(lower_bound(begin(pos[S[j]-'a']), end(pos[S[j]-'a']), j)) - begin(pos[S[j]-'a']);
                        // if(left > right) {
                        //     dp[i][j] = dp[i + 1][j - 1] * 2 + 2;
                        // }else if(left == right) {
                        //     dp[i][j] = dp[i + 1][j - 1] * 2 + 1;
                        // }else {
                        //     left = pos[S[i]-'a'][left];
                        //     right = pos[S[j]-'a'][right];
                        //     dp[i][j] = dp[i + 1][j - 1] * 2 - dp[left + 1][right - 1];
                        // }
                        dp[i][j] = left > right?dp[i + 1][j - 1] * 2 + 2:(left<right?dp[i + 1][j - 1] * 2 - dp[pos[S[i]-'a'][left] + 1][pos[S[j]-'a'][right] - 1]:dp[i + 1][j - 1] * 2 + 1);
                    }else {
                        dp[i][j] = d > 2? (dp[i][j - 1] + dp[i + 1][j]) - dp[i + 1][j - 1]: 2;
                    }
                    dp[i][j] >= mod?dp[i][j]%=mod:(dp[i][j]<0?dp[i][j]+=mod:0);
                }
            }
            return dp[0][len - 1];
        }
    };
    

    小的线程例子

    #include<stdlib.h>
    #include<stdio.h>
    #include<pthread.h>
    void *myThread1(void) {
        int i;
        for(i = 0; i < 100; ++i) {
    	printf("This is the 1st pthread created.
    ");
    	sleep(1);
        }
    }
    void *myThread2(void) {
        int i;
        for(i = 0; i < 100; ++i) {
    	printf("This is the 2nd pthread created.
    ");
    	sleep(1);
        }
    }
    int main() {
        int i = 0, ret = 0;
        pthread_t id1, id2;
        ret = pthread_create(&id1, NULL, (void*)myThread1, NULL);
        if(ret) {
    	printf("Create pthread error!
    ");
    	return 1;
        }
        ret = pthread_create(&id2, NULL, (void*)myThread2, NULL);
        if(ret) {
    	printf("Create pthread error!
    ");
    	return 1;
        }
        pthread_join(id1, NULL);
        pthread_join(id2, NULL);
        return 0;
    }
    
  • 相关阅读:
    [CF837B] Flag of Berland(乱写)
    [Uva12563] Jin Ge Jin Qu hao (完全背包,dp)
    [BZOJ2818] Gcd (数论,欧拉函数,线性筛)
    [CF777E] Hanoi Factory(贪心,栈)
    [CF777D] Cloud of Hashtags(贪心,二分)
    [CF777C] Alyona and Spreadsheet(dp)
    [BZOJ2440][中山市选2011]完全平方数(莫比乌斯函数,二分)
    [CF821C] Okabe and Boxes(模拟,栈)
    Codeforces Round #363 (Div. 2)->B. One Bomb
    Codeforces Round #363 (Div. 2)->A. Launch of Collider
  • 原文地址:https://www.cnblogs.com/Cwolf9/p/11910768.html
Copyright © 2011-2022 走看看