高级程序设计总结6--动态规划

一.DP思想步骤

1.确认原问题与子问题

原问题是求n的最优解,子问题是求1,2,n-1的最优解

2.确定状态

第i个状态的最优解

3.确定边界状态的值

例如第1,第2个状态可以直接定义

4.确定状态转移方程

dp[i]由题意和边界状态求得

二.例题

1.爬楼梯

每次可走1阶或2阶楼梯,问n阶有多少种上楼的方式?

int climbStairs(int n){
    vector<int> dp(n+3,0);//状态数组
    dp[1]=1;
    dp[2]=2;//确定边界状态
    for(int i=3;i<=n;i++){
        dp[i]=dp[i-1]+dp[i-2];//状态转移矩阵
    }
    return dp[n];
}

2.不同路径

有一个m*n的网格,从左上角出发到右下角,每次只能向下或向右移动一格,问有多少不同路径?

int pathSum(int m,int n){
    vector<vector<int>> res(m,vector<int>(n,1));
    for(int i=1;i<m;i++){
        for(int j=1;j<n;j++){
            res[i][j]=res[i-1][j]+res[i][j-1];//每个位置只可能从上面或左面过来
        }
    }
    return res[m-1][n-1];
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值