斐波那契数

class Solution {
public:
    int fib(int n) {
        if (n < 2) {
            return n;
        }
        int p = 0, q = 0, r = 1;
        for (int i = 2; i <= n; ++i) {
            p = q; 
            q = r; 
            r = p + q;
        }
        return r;
    }
};

第 N 个泰波那契数

class Solution {
public:
    int tribonacci(int n) {
        if (n == 0) {
            return 0;
        }
        if (n <= 2) {
            return 1;
        }
        int p = 0, q = 0, r = 1, s = 1;
        for (int i = 3; i <= n; ++i) {
            p = q;
            q = r;
            r = s;
            s = p + q + r;
        }
        return s;
    }
};

爬楼梯

class Solution {
public:
    int climbStairs(int n) {
        int p = 0, q = 0, r = 1;
        for (int i = 1; i <= n; ++i) {
            p = q; 
            q = r; 
            r = p + q;
        }
        return r;
    }
};

使用最小花费爬楼梯

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n = cost.size();
        vector<int> dp(n + 1);
        dp[0] = dp[1] = 0;
        for (int i = 2; i <= n; i++) {
            dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }
        return dp[n];
    }
};

买卖股票的最佳时机

class Solution
{
public:
    int max(int x, int y)
    {
        return x > y ? x : y;
    }
    int maxProfit(vector<int> &prices)
    {
        if(prices.size()==1)
            return 0;
        int low_price = prices[0];
        prices[0] = 0;
        for (int i = 1; i < prices.size(); i++)
        {
            low_price = low_price > prices[i] ? prices[i] : low_price;
            if (prices[i] > low_price)
                prices[i] = max(prices[i - 1], prices[i] - low_price);
            else
                prices[i] = prices[i - 1];
        }
        return prices.back();
    }
};

最长公共子序列

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int m = text1.length(), n = text2.length();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1));
        for (int i = 1; i <= m; i++) {
            char c1 = text1.at(i - 1);
            for (int j = 1; j <= n; j++) {
                char c2 = text2.at(j - 1);
                if (c1 == c2) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
                }
            }
        }
        return dp[m][n];
    }
};

杨辉三角形

节点选择

#include<bits/stdc++.h>

using namespace std;

vector<vector<int> > v;//存放树形结构 

int dp[100005][2] = {0};

void dfs(int a, int pre){
    for(int i = 0; i < v[a].size(); i++){
        int t = v[a][i];
        if(t != pre){//只要不是相邻节点就符合题意 
            dfs(t, a);
            dp[a][0] += max(dp[t][0], dp[t][1]);//不选择该节点,保存下一节点的最大值 
            dp[a][1] += dp[t][0];//选择该节点,下一节点只能不选择 
        }
    }
}
int main(){
    int n, a, b;
    cin >> n;
    v.resize(n + 1);//给定数据大小 
    for(int i = 1; i <= n; i ++)
        cin >> dp[i][1];//输入节点的权重 
    for(int i = 0; i < n-1; i ++){
        cin >> a >> b;//输入节点之间的关系 
        v[a].push_back(b);
        v[b].push_back(a);
    }
    dfs(1, 0);
    cout << max(dp[1][0], dp[1][1]) << endl;
    return 0;
} 

耐摔指数

#include<bits/stdc++.h>
using namespace std;
int f2[105],f3[105];
int main(){
    int n;
    while(~scanf("%d",&n)){
        int i=0;
        while(f3[i]<n){
            i++;
            f2[i]=f2[i-1]+i;
            f3[i]=f3[i-1]+f2[i-1]+1;
        }
        cout<<i<<endl; 
    }
    return 0;

k好数

#include <iostream>
#include <cmath>
using namespace std;
#define MOD 1000000007
//L位K进制 
void Count(int length,int range){
    long long int dp[110][110],sum=0;
    for(int j=0;j<100;j++)
        dp[0][j]=1;
    for(int i=1;i<length;i++){
        for(int j=0;j<range;j++){
            for(int k=0;k<range;k++){
                if(abs(j-k)!=1){        //判断不是相邻位
                    if(i==length-1 && j==0)  //当i为数的最高位时不能为0 
                        continue;
                    dp[i][j]=dp[i][j]+dp[i-1][k];    
                    dp[i][j]%=MOD;
                }
            }
        }
    } 
    for(int i=0;i<range;i++){
        sum+=dp[length-1][i];
        sum%=MOD;
    }    
    cout<<sum;
}
int main() {
    int k,l;
    cin>>k>>l;
    if(k==1 && l==1)    cout<<0;
    else if(k>1 && l==1)
            cout<<k;
    else if(l>1)
            Count(l,k);
    return 0;
}

版权属于:染念
作品采用:本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
更新于: 2022年01月23日 13:40
15
发表评论


180 文章数
673 评论量
4 分类数
184 页面数
已在风雨中度过 7年75天17小时47分
目录
来自 《【思特奇杯·云上蓝桥-算法集训营】第3周》
© 2024 染念Blog
浙ICP备19020194号-1
暗黑模式
暗黑模式
评论
返回顶部
© 2024 染念Blog
浙ICP备19020194号-1
暗黑模式
暗黑模式
评论
返回顶部