• 递推算法 C++


    题目 2121: 信息学奥赛一本通T1313-位数问题

    1. #include<iostream>
    2. using namespace std;
    3. int main()
    4. {
    5. int n;
    6. cin>>n;
    7. int even[1005],odd[1005];
    8. even[1]=8,odd[1]=1;//注意03也是偶数
    9. for(int i=2;i<=n;i++)
    10. {
    11. even[i]= (even[i-1]*9 + odd[i-1])%12345;//偶数的个数
    12. odd[i]= (odd[i-1]*9 + even[i-1])%12345;//奇数的个数
    13. }
    14. cout<<even[n]<<endl;
    15. return 0;
    16. }

    题目 2122: 信息学奥赛一本通T1314-过河卒

    1. #include<iostream>
    2. #include<cmath>
    3. using namespace std;
    4. int horse[8][2]={{-2,-1},{-1,-2},{-2,1},{-1,2},{1,2},{2,1},{1,-2},{2,-1}};
    5. int map[25][25];
    6. long long dp[25][25];//动态规划记录到达每一个点的路径条数
    7. int main()
    8. {
    9. int n,m,cx,cy,tx,ty;
    10. cin>>n>>m>>cx>>cy;
    11. map[cx][cy]=1;//定义马的原点为1
    12. for(int i=0;i<8;i++)//定义马的其他点为1
    13. {
    14. tx=cx+horse[i][0];
    15. ty=cy+horse[i][1];
    16. if(tx>=0 && tx<=n && ty>=0 && ty<=m)//确保马的点在需要运行的范围棋盘内的修改为1
    17. {
    18. map[tx][ty]=1;
    19. }
    20. }
    21. dp[0][0]=1;
    22. for(int i=0;i<=n;i++)//有马的点为1,无马的点为0,所以此处只加0点,要注意最后
    23. //一个else if条件一定要限定好
    24. {
    25. for(int j=0;j<=m;j++)
    26. {
    27. if(map[i][j]==0){//要限定条件棋盘上面的点为0才进行加减
    28. //要思考一下就是马的九个点完全有可能在下面判断的条件内
    29. if(i==0 && j!=0)
    30. dp[i][j]+=dp[i][j-1];
    31. else if(i!=0 && j==0)
    32. dp[i][j]+=dp[i-1][j];
    33. else if(i!=0 && j!=0)
    34. dp[i][j]=dp[i-1][j]+dp[i][j-1];
    35. }
    36. }
    37. }
    38. cout<<dp[n][m]<<endl;
    39. return 0;
    40. }

    这道题目思路主要是:

    1.设定从原点到终点的棋盘上面全部都是0

    2.设定马存在的9点的棋盘上全部都是1

    3.在第一行和第一列的每下一个点,dp直接加前面的数字就好,因为这一行或者这一列只有一种行走的情况

    4.而在其他的行列之间,dp应该相加的是上一列同行和上一行同列的两个dp,用纸笔推导一下就好.

    题目 1257: 超级楼梯

    1. #include<iostream>
    2. using namespace std;
    3. unsigned long long int dp(int m){
    4. if( m == 1 || m == 0)
    5. return 1;
    6. return dp(m-2)+dp(m-1);
    7. }
    8. int main()
    9. {
    10. int n,m[100000];
    11. cin>>n;
    12. for(int i=0;i<n;i++){
    13. cin>>m[i];
    14. cout<<dp(m[i]-1)<<endl;
    15. }
    16. return 0;
    17. }

    思路:

    1.刚开始在第一级,所以最后进行输出的时候要减一

    2.递推函数 如果m是0或者1也就说,走到第0级或者第一级,只有一种走法

    3.从第二级开始,每一级的走法过程都是前面两个dp的和,具体解释如下:

    目的地-走法

    1-1    2-1   3-2   4- 3  5-5  ........能够发现规律的话,这个题目就很简单了      

  • 相关阅读:
    Xilinx ISE系列教程(1):ISE开发环境下载、安装、注册(Windows 10 64位系统)
    异步编程概述
    蓝牙查看接收到GIF格式的图片报错问题
    STM32如何使用定时器
    Stable diffusion的架构解读(本博客还是以unet架构为主)
    Android Studio 新版本 Logcat 速查
    教程:使用 Keras 优化神经网络
    Leetcode.122 买卖股票的最佳时机 II
    Docker容器中杀死僵尸进程、jobs命令
    UI自动化概念 + Web自动化测试框架介绍
  • 原文地址:https://blog.csdn.net/Lukegood/article/details/128010132