【云上蓝桥·思特奇杯-算法集训营】第三周

【云上蓝桥·思特奇杯-算法集训营】第三周,第1张

【云上蓝桥·思特奇杯-算法集训营】第三周

斐波那契数

int fib(int n){
    int a1 = 1,a2 = 1,cur = 0;
    if(n == 1 | n == 2) return 1;
    for(int i = 2;i < n;i++)
    {
        cur = a1 + a2;
        a1 = a2;
        a2 = cur;
    }
    return cur;
}

第N个泰波那契数

class Solution {
public:
    int tribonacci(int n) {
        int res;
        int a = 0,b = 1,c = 1,temp = 0;
        if(n == 0) return a;
        if(n == 1) return b;
        if(n == 2) return c;
        for(int i = 3;i <= n;++i)
        {
            temp = a+b+c;
            a = b;
            b = c;
            c = temp;
        }
        return temp;
    }
};

爬楼梯

int climbStairs(int n){
    int method[n];
    if(n == 1||n == 2) return n;
    method[0] = 1;
    method[1] = 2;
    for(int i = 2;i < n;i++){
        method[i] = method[i - 1] + method[i - 2];
    }
    int target = method[n-1];
    return target;
}

 使用最小花费爬楼梯

#define MIN(x,y)  x < y ? x : y
int minCostClimbingStairs(int* cost, int costSize){
    int dp[costSize + 1],res;
    dp[0] = dp[1] = 0;
    for(int i = 2;i <= costSize;i++)
    {
        dp[i] = MIN(dp[i - 1] + cost[i - 1],dp[i - 2] + cost[i - 2]);
        res = dp[i];
    }
    return res;
}

买卖股票最佳时机

#define MIN(x,y) ((x) < (y)) ? (x) : (y)
int maxProfit(int* prices, int pricesSize){
    int date[pricesSize],min;
    date[0] = -prices[0],min = prices[0];
    for(int i = 1;i < pricesSize;i++){
        date[i] = prices[i] - min;
        min = MIN(min,prices[i]);
    }
    int profit = date[0];
    for(int i = 1;i < pricesSize;i++){
        if(date[i] > profit){
            profit = date[i];
        }
    }
    if(profit < 0) return 0;
    else return profit;
}

最长公共子序列(LCS) 

class Solution {
public:
    int longestCommonSubsequence(string text1, string text2) {
        int len = fmax(text1.size(),text2.size());
        int dp[len+1][len+1];
        memset(dp,0,sizeof(dp));
        for(int i = 1;i <= text1.size();++i)
        {
            for(int j = 1;j <= text2.size();++j)
            {
                dp[i][j] = fmax(dp[i-1][j],dp[i][j-1]);
                if(text1[i-1] == text2[j-1])
                dp[i][j] = fmax(dp[i][j],dp[i-1][j-1] + 1);
            }
        }
        return dp[text1.size()][text2.size()];
    }
};

节点选择

#include
#include
#include

using namespace std;
int dp[100002][2];
vector >v;
void dfs(int node,int pre)
{
   for(int i = 0;i < v[node].size();i++)
   {
       int temp = v[node][i];
       if(temp != pre)
       {
           dfs(temp,node);
           dp[node][1] += dp[temp][0];
           dp[node][0] += max(dp[temp][0],dp[temp][1]);
       }
   }
}
int main()
{
 int n;
 cin >> n;
 for(int i = 1;i <= n;i++)
 {
     cin >> dp[i][1];
 }
 int a,b;
 v.resize(n+1);
 for(int i = 1;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;
}

K好数

#include 
#include 
#include 
using namespace std;
int main()
{
    int k, l;
    cin >> k >> l;
    vector > dp(l+1, vector(k, 0));
    for(int i = 0; i < k;i++) dp[1][i] = 1;
    for(int i = 2; i <= l;i++)
    {
        for(int j = 0; j < k;j++)
        {
            int sum = 0;
            for(int m = 0; m < k;m++)
            {
                if(abs(m-j)!=1)  sum = (sum + dp[i - 1][m]) % 1000000007;
                dp[i][j] = sum;
            }
        }
    }
    int result = 0;
    for(int i = 1; i < k;i++)
    {
        result = (result + dp[l][i]) % 1000000007;
    }
    cout << result;
    return 0;
}

 

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713397.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-18

发表评论

登录后才能评论

评论列表(0条)

保存