递推算法训练

第一题:

洛谷2.8 - 小志61314 - 博客园 (cnblogs.com)

第二题:

P1028 [NOIP2001 普及组] 数的计算 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

题意很明显:

其实我要从以前的思维里面跳出来,我刚开始看这个题想找规律,就是硬想,其实只需要掌握一下递推式就好

比如n=10;

因为加原数的一半,所以在每次加之后就只需要考虑后面的就好

f(10)=f(1)+f(2)+f(3)+f(4)+f(5)

于此类推,下面看代码:

复制代码
#include<iostream>
using namespace std;
const int N=1010;
int f[N];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        f[i]=1;
        for(int j=1;j<=i/2;j++)
        {
            f[i]+=f[j];
        }
    }
    cout<<f[n];
    return 0;
}
复制代码

 挖地雷:

 

 啧,有点草率了,思路我想到了,但是还是不够具体,我的评价是这题是一个递推+大型的if-else分支的题,hh,反正思路不是那么清晰而且码力不太够,ac43,草率了,多练练吧。下面直接贴正确代码,哦对了,a(i)=b(i-1)+b(i)+b(i+1),就这个,而且从边界出发到最后必然可以递推到,我打算从3出发,那万一没有呢是吧,反正我刚开始的思路奇奇怪怪

复制代码
#include<iostream>
using namespace std;
int n;
const int N=1e5+10;
int a[N],b[N];
int check()
{
    for(int i=2;i<=n;i++)
    {
        b[i+1]=a[i]-b[i-1]-b[i];
        if(b[i+1]<0||b[i+1]>3) return 0;
    }
    if(b[n+1]!=0) return 0;
    else return 1;
}
int main(){
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        if(a[i]<0||a[i]>3)
        {
            cout<<"No answer";
            return 0;
        }
    }
    if(a[1]==0)
    {
        b[1]=0;
        b[2]=0;
    }
    if(a[1]==2)
    {
        b[1]=1;
        b[2]=1;
    }
    if(a[1]==1)
    {
        b[1]=0;
        b[2]=1;
    }
    int x=check();
    if(a[1]==1&&!x)
    {
        b[1]=1;
        b[2]=0;
    }
    x=check();
    if(!x) cout<<"No answer";
    else for(int i=1;i<=n;i++) cout<<b[i]<<" ";
    return 0;
}
/*
a[i]=b[i-1]+b[i]+b[i+1]
b[i+1]=a[i]-b[i-1]-b[i]

*/
复制代码

偶数3的个数

 

 

复制代码
#include<iostream>
using namespace std;
const int N=1010;
int f[N][2];
int main(){
    int n;
    cin>>n;
    f[1][0]=9;
    f[1][1]=1;
    int k=9;
    for(int i=2;i<=n;i++)
    {
        if(i==n) k--;
        f[i][0]=f[i-1][0]*k+f[i-1][1];
        f[i][1]=f[i-1][1]*k+f[i-1][0];
    }
    cout<<f[n][0];
    return 0;
}
/*
令f[i][1]为1~i中奇数的个数
f[i][0]为1~i中偶数的个数
可以由前面推到后面
第i位偶数个3必须满足(和奇数偶数都有关系的):
前i个是偶数个3,第i位不能取3(第i位有9个)
前i个是奇数个3,第i位必须取3(第i位有1个) 
(上面只是两种情况)
f[i][0]=f[i-1][0]*9+f[i-1][1];//因为第i位只有一个3 
f[i][1]=f[i-1][1]*9+f[i-1][0];
奇数+偶数的全体是n位数里面一共的数 
*/
复制代码

 

posted @   小志61314  阅读(34)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示