暴力递归到动态规划

程序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;
}
全部评论

相关推荐

hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务