暴力递归到动态规划

程序1:汉诺塔问题

#include<iostream> // N层汉诺塔问题
using namespace std;
#include<string>

void process(int N, string from,string to,string help)
{
    if(N == 1)
    {
        cout<<"Move 1 from  "+ from +"to "+ to<<endl;
    }
    else
    {
        process(N-1,from, help, to);
        cout<<"Move " +  to_string(N) + " from "+ from +"to "+ to<<endl;
        process(N-1, help, to, from);
    }

}

int main() 
{
    process(3,"左"," 右", "中");
    return 0;
}

程序2:打印字符串的全部子序列

#include<iostream> // 打印字符串的全部子序列
using namespace std;
#include<string>

void printAllSub(string str,int i,string res)
{
    if(i == str.length())
    {
        cout<<res<<endl;
        return;
    }
    printAllSub(str, i+1, res);
    printAllSub(str, i+1,res+=str[i]);
}

int main() 
{
    string test = "abc";
    printAllSub(test,0,"");
    return 0;
}

程序3:二维数组沿途经过的和最小,+数组中求几个数的值,暴力版本

#include<iostream> // 二维数组沿途经过的和最小,+数组中求几个数的值,暴力版本
using namespace std;
#include<string>


int walk(int* arr[], int i, int j,int row,int clo)
{
    if(i == row - 1 && j == clo - 1)
    {
        return arr[i][j];
    }
    if(i == row-1)
    {
        return arr[i][j] + walk(arr,i,j+1, row,clo);
    }
    if(j == clo - 1)
    { 
        return arr[i][j] + walk(arr, i+1,j, row,clo);
    }  
    int right = walk(arr, i,j+1, row,clo);  //当前位置,右边位置到右下角的最短路径和
    int down = walk(arr, i+1,j, row,clo);  //当前位置,下边位置到右下角的最短路径和
    return arr[i][j] + min(right,down);
}

bool isSum(int *arr, int i, int sum, int aim)   //数组中几个数的和是否等于给定值
{
    if(i == sizeof(arr) / sizeof(int))
    {
        return sum == aim;
    }
    return isSum(arr, i+1, arr[i]+sum, aim) || isSum(arr, i+1,sum,aim);
}

int main() 
{
    int arr[2][2] = {1,2,3,4};
    int arr2[3] = {1,4,8};
    cout<<isSum(arr2,0,0,5)<<endl;
    return 0;
}

程序4:几个经典的动态规划,二维数组做参数传递问题未解决

#include<iostream> // 几个经典的动态规划,二维数组做参数传递问题未解决
using namespace std;
#include<string>


int process1(int arr[], int index,int aim,int len)
{
    int res = 0;
    if(index == len)
    {
        return res = aim==0?1:0;
    }
    else
    {
        for(int i=0;arr[index] * i<=aim;i++)
        {
            res+=process1(arr,index+1,aim - arr[index] * i,len);
        }
    }
}
int const1(int *arr, int aim,int len)  //凑钱数,暴力递归方法
{
    if(arr == nullptr | aim<0 | len==0)
    {
        return 0;
    }
    return process1(arr,0,aim, len);
}
int process2(int arr[], int index,int aim,int len,int* mapm)    //二维数组做参数传递问题未解决
{
    int res = 0;
    if(index == len)
    {
        return res = aim ==0?1:0;
    }
    else
    {
        int mapValue = 0;
        for(int i=0;arr[index]*i<=aim;i++)
        {
            // mapValue = mapm[index+1][aim-arr[index]*i];
            mapValue = *(mapm+(index+1)*(aim+1) + (aim-arr[index]*i));
            if(mapValue!=0)
            {
                res+=mapValue==-1?0:mapValue;
            }
            else
            {
                res+=process2(arr,index+1,aim-arr[index]*i,len,mapm);
            }

        }
    }
    *(mapm+index*(aim+1) + aim) = res==0?-1:res;
    return res;
}
int const2(int *arr, int aim,int len) // 凑钱数,记忆力搜索方法
{
    if(arr == nullptr |aim <0 | len ==0)
    {
        return 0;
    }
    int mapm[len+1][aim+1];
    return process2(arr,0,aim, len,(int*)mapm);
}

int s1(int n)   //台阶问题
{
    if(n<0)
    {
        return 0;
    }
    if(n == 1 ||n ==2)
    {
        return n;
    }
    return s1(n-1) + s1(n-2);
}


void show(int *arr, int m,int n)
{
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            *(arr+n*i+j)=i*j;
        }
    }
}
int main() 
{

    int a[5][5];
    show((int *)a, 5,5);
    for(int i=0;i<5;i++)
    {
        for(int j=0;j<5;j++)
        {
            cout<<*(a+i*5+j)<<"    ";
        }
        cout<<endl;
    }
    return 0;
}
全部评论

相关推荐

bg双非本科,方向是嵌入式。这次秋招一共拿到了&nbsp;8&nbsp;个&nbsp;offer,最高年包&nbsp;40w,中间也有一段在海康的实习经历,还有几次国家级竞赛。写这篇不是想证明什么,只是想把自己走过的这条路,尽量讲清楚一点,给同样背景的人一个参考。一、我一开始也很迷茫刚决定走嵌入式的时候,其实并没有一个特别清晰的规划。网上的信息很零散,有人说一定要懂底层,有人说项目更重要,也有人建议直接转方向。很多时候都是在怀疑:1.自己这种背景到底有没有机会2.现在学的东西到底有没有用3.是不是已经开始晚了这些问题,我当时一个都没答案。二、现在回头看,我主要做对了这几件事第一,方向尽早确定,但不把自己锁死。我比较早就确定了嵌入式这个大方向,但具体做哪一块,是在项目、竞赛和实习中慢慢调整的,而不是一开始就给自己下结论。第二,用项目和竞赛去“证明能力”,而不是堆技术名词。我不会刻意追求学得多全面,而是确保自己参与的每个项目,都能讲清楚:我负责了什么、遇到了什么问题、最后是怎么解决的。第三,尽早接触真实的工程环境。在海康实习的那段时间,对我触动挺大的。我开始意识到,企业更看重的是代码结构、逻辑清晰度,以及你能不能把事情说清楚,而不只是会不会某个知识点。第四,把秋招当成一个需要长期迭代的过程。简历不是一次写完的,面试表现也不是一次就到位的。我会在每次面试后复盘哪些问题没答好,再针对性补。三、我踩过的一些坑现在看也挺典型的:1.一开始在底层细节上纠结太久,投入产出比不高2.做过项目,但前期不会总结,导致面试表达吃亏3.早期有点害怕面试,准备不充分就去投这些弯路走过之后,才慢慢找到节奏。四、给和我背景相似的人一点建议如果你也是双非,准备走嵌入式,我觉得有几件事挺重要的:1.不用等“准备得差不多了”再投2.项目一定要能讲清楚,而不是做完就算3.不要只盯着技术,多关注表达和逻辑很多时候,差的不是能力,而是呈现方式。五、写在最后这篇总结不是标准答案,只是我个人的一次复盘。后面我会陆续把自己在嵌入式学习、竞赛、实习和秋招中的一些真实经验拆开来讲,希望能对后来的人有点帮助。如果你正好也在这条路上,希望你能少走一点弯路。
x_y_z1:蹲个后续
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务