当前位置:   article > 正文

C++ 动态规划例题详解_c++动态规划经典题目详解

c++动态规划经典题目详解

递推问题

利用递推解决问题,我们就要模仿求斐波那契数列的过程。首先,确定几个规模较小的问题答案。然后考虑如何由这几个规模较小的答案推得后面的答案。一旦有了递推规则和数列初始的几个值,计算机程序就能帮助我们求解数列后面的所有数字,我们的问题也得到了解决。

例题1:

代码:

  1. //
  2. // 93.cpp
  3. // N阶楼梯上楼问题
  4. //
  5. // Created by chenmeiqi on 2019/4/17.
  6. // Copyright © 2019年 chenmeiqi. All rights reserved.
  7. //
  8. #include <iostream>
  9. using namespace std;
  10. // 递归解法
  11. int getKind(int n){
  12. if(n==1) return 1;
  13. else if(n==2) return 2;
  14. else {
  15. return getKind(n-1)+getKind(n-2);
  16. }
  17. }
  18. int main(int argc, const char * argv[]) {
  19. int n;
  20. long long res[90]; // res数组保存数列的每一个值,由于数值过大,我们需要使用long long类型
  21. while (cin>>n) {
  22. // cout<<getKind(n)<<endl; // 递归解法
  23. res[1]=1;
  24. res[2]=2;
  25. for (int i=3; i<=n; i++) {
  26. res[i]=res[i-1]+res[i-2];
  27. }
  28. cout<<res[n]<<endl;
  29. }
  30. return 0;
  31. }

分析: 


例题2:

 代码:

  1. //
  2. // 94.cpp
  3. // 不容易系列之一
  4. //
  5. // Created by chenmeiqi on 2019/4/17.
  6. // Copyright © 2019年 chenmeiqi. All rights reserved.
  7. //
  8. #include <iostream>
  9. using namespace std;
  10. int getKinds(int n){
  11. if(n==1){
  12. return 0;
  13. }
  14. else if(n==2){
  15. return 1;
  16. }
  17. else{
  18. return (n-1)*getKinds(n-1)+(n-1)*getKinds(n-2);
  19. }
  20. }
  21. int main(int argc, const char * argv[]) {
  22. int n;
  23. while (cin>>n) {
  24. cout<<getKinds(n)<<endl;
  25. }
  26. return 0;
  27. }

分析:(错排公式) 


最长递增子序列(LIS)

例题:

代码:

  1. //
  2. // 95.cpp
  3. // 拦截导弹
  4. //
  5. // Created by chenmeiqi on 2019/4/17.
  6. // Copyright © 2019年 chenmeiqi. All rights reserved.
  7. //
  8. #include <iostream>
  9. #include <algorithm>
  10. using namespace std;
  11. bool cmp(int a,int b){ // 从高到低排
  12. return a>b;
  13. }
  14. int main(int argc, const char * argv[]) {
  15. int k;
  16. int a[26];
  17. int max;
  18. while (cin>>k) {
  19. int res[26]={0}; // 初始化,便于排序
  20. for (int i=0; i<k; i++) {
  21. cin>>a[i];
  22. }
  23. res[0]=1; // 初始化0位置的最长子序列为1
  24. for (int i=1; i<k; i++) {
  25. res[i]=1;
  26. max=1;
  27. for (
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/716670
推荐阅读
相关标签
  

闽ICP备14008679号