栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

第一题 斐波那切数
class Solution {
public int fib(int N) {
if(N <= 1) return N;
int first = 0, second = 1;
for(int i = 0; i < N - 1; i++){
int sum = first + second;
first = second;
second = sum;
}
return second;
}
}

第二题
class Solution {
public:
int tribonacci(int n) {
int a[100]={0,1,1};
for(int i = 3;i<=n;i++)
{
a[i]=a[i-1]+a[i-2]+a[i-3];
}
return a[n];
}
};

第三题 爬楼梯

public static int climbStairs(int n) {
if (n == 1){
return 1;
}
if (n == 2){
return 2;
}
return climbStairs(n-1)+climbStairs(n-2);
}

第四题 使用最小花费爬楼梯
class Solution {
public:
int minCostClimbingStairs(vector& cost) {
//特判
if (cost.empty()) return 0;
if (cost.size() == 1) return cost[0];
if (cost.size() == 2) return min(cost[0], cost[1]);
vector dp(cost.size()+1);
//初始值
dp[0] = 0;
dp[1] = 0;
//状态转移
for (int i=2;i<=cost.size();i++)
{
dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
}
return dp[cost.size()];
}
};

第五题 买入股票的最佳时机

#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))

int getmin(int *prices,int size)
{
int i = 0;
int tmp = 0;
tmp = prices[0];
for (i=1;i {
if (prices[i] < tmp)
{
tmp = prices[i];
}
}

return tmp;

}

int maxProfit(int* prices, int pricesSize)
{
int dp[200000] = {0};
int i = 0;
int tmp = 0;
dp[0] = 0;
dp[1] = 0;

if (pricesSize == 1)
{
    return 0;
}

tmp = prices[0];
for (i = 2;i <= pricesSize;i++)
{
    //tmp = getmin(prices,i-1);//这里每一次都求的话显然没有必要且重复计算,导致超时
    tmp = min(tmp,prices[i-1]);
	printf("%dn",tmp);
    dp[i] = max(dp[i-1],prices[i-1] - tmp);
}

return dp[pricesSize];

}

第六题 最长公共子序列
//最长公共子序列
#include
#include
#include
#define MAX 1001
using namespace std;
int dp[MAX][MAX];
int main()
{
int N;
cin >> N;
while(N–)
{
string a,b;
cin >> a >> b;
memset(dp,0,sizeof(dp));
int len_a=a.size(),len_b=b.size();
for(int i=0;i {
for(int j=0;j {
if(a.at(i)==b.at(j))
dp[i+1][j+1]=dp[i][j]+1;
else
dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
}
}
cout << dp[len_a][len_b] << endl;
a.clear();
b.clear();
}
return 0;
}

第七题 杨辉三角形
#include
#include
using namespace std;


int main(){
const int n=11;//变量n在此处起到了限制输出行数的作用,可优化成用户输入
int i,j,a[n][n];

//使第一列和对角线元素的值为1
for (i=1;i a[i][i]=1;//使最右侧边全为1
a[i][1]=1;//使最左侧边全为1
}

//从第三行开始处理
for (i=3;i for (j=2;j<=i-1;j++) //j始终慢i一步
a[i][j]=a[i-1][j-1]+a[i-1][j];//每个数等于它上方两数之和,如a32=a21+a22

//输出数组各元素的值
for (i=1;i for (j=1;j<=i;j++) //利用j将每一行的数据全部输出
cout< }
cout< return 0;
}

第八题 节点选择

    ///邻接表构建过程#include #include #include #include #include using namespace std;typedef long long LL;struct Edge{
    int edge;  
    
    int next;  
    
    }e[300000];int head[300000],val[300000];int N,M;LL dp[150000][2]; ///dp[s/u][0/1],u为s的子节点,0表示包含自己的以s为根节点的子树最大值,1表示不包含自己的以s为根节点的子树最大值bool v[150000];void add(int s,int ee){
    e[++M].edge = ee;           ///边的终点  
    
    e[M].next = head[s];        ///邻边  
    
    head[s] = M;                ///当前边  
    
    }void dfs(int s){
    dp[s][0]=val[s];  
    
    dp[s][1]=0;  
    
    for(int i=head[s];i!=-1;i=e[i].next)  
    
    {  
    
        int u=e[i].edge;  
    
        if(v[u]==0)  
    
        {  
    
            v[u]=1;  
    
            dfs(u);  
    
            dp[s][0]+=dp[u][1];  
    
            dp[s][1]+=max(dp[u][1],dp[u][0]);  
    
            v[u]=0;  
    
        }  
    
    }  
    
    }int main(){
    int s,e;  
    
    int ans=0;  
    
    memset(head,-1,sizeof(head));  
    
    memset(dp,0,sizeof(dp));  
    
    memset(v,0,sizeof(v));  
    
    cin>>N;  
    
    for(int i=1;i<=N;i++)  
    
        cin>>val[i];  
    
    for(int i=1;i  
    {  
    
        cin>>s>>e;  
    
        add(s,e);  
    
        add(e,s);  
    
    }  
    
    v[1]=1;  
    
    dfs(1);  
    
    v[1]=0;  
    
    ans=max(dp[1][0],dp[1][1]);  
    
    cout<
    return 0;  
    
    }

第九题 耐摔指数

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
const int maxn=1e5+5;
typedef long long ll;
using namespace std;
int f2[105],f3[105];
int main(){
int n;
while(~scanf("%d",&n)){
int i=0;
while(f3[i] i++;
f2[i]=f2[i-1]+i;//这里i本身就++了,所以不用加一了
f3[i]=f3[i-1]+f2[i-1]+1;
}
cout< }
return 0;
}

第十题 k好数

#include
#include
using namespace std;
int dp[1000][1000];
const int MOD=1000000007;
int main()
{
int sum=0;
int CountK(int,int,int);
int K,L;
cin>>K>>L;
if(K1&&L1) //这里对1位1进制的个数为啥不是1表示不理解
cout<<0< else if(K>1&&L==1)//1位的K进制的K好数总数就是K个
cout< else if(L>1)
cout< return 0;
}
int CountK(int length,int range,int sum)
{
for(int i=1;i {
dp[0][i]=1;
}
for(int i=1;i {
for(int j=0;j {
for(int k=0;k {
if(abs(j-k)!=1)
{
if((j-1)0&&k0)//排除首位为0的情况
continue;
dp[i][j]=dp[i][j]+dp[i-1][k];
dp[i][j]%=MOD;
}
}
}
}
for(int i=0;i {
sum+=dp[length-1][i];
sum%=MOD;
}
return sum;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/717945.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号