动态规划

来源:互联网 发布:苹果mac xshell 编辑:程序博客网 时间:2024/06/08 05:17
题目
个顶一个矩阵m,从左上角开始只能向右或向下走,走到右下角的位置,路径上所有数字累加起来就是路径和,返回所有路径最小的路径和
举例
1,3,5,9,
8,1,3,4,
5,0,6,1,
8,8,4,0,
最小路径为:1 3 1 0 6 1 0,最小和12
思路】:
这是一到经典的动态规划题目,比较简单
使用dp[4][4]表示到达(4,4)路径的最小值,而到达(4,4)路径有两条路
1、(3,4)->(4,4)      2、(4,3)->(4,4)

(4,4)的最小值就为 dp[3][4]+0,dp[4][3]+0,两者的最小值。


结论
dp[i][j]表示到达(i,j)的最小值
于是:dp[i][j] = min(dp[3][4, dp[4][3]])+(i,j)
当且:   i=1时,dp[i][j]=dp[i][j-1]+buf[i][j]; 
              j=1时,dp[i][j]=dp[i-1][j]+buf[i][j];
              i=j=1;dp[1][1]=(1,1);
代码】
#include <iostream>
#include <string>
#include <string.h>
#include <vector>
#include<iomanip>
#include <math.h>
#include <algorithm>
using namespace std;
int buf[5][5]={
0,0,0,0,0,
0,1,3,5,9,
0,8,1,3,4,
0,5,0,6,1,
0,8,8,4,0,
};
int dp[5][5]={0};
int main(int argc, char *argv[])
{
for(int i=1;i<=5;i++)
{
for(int j=1;j<=5;j++)
{
if(i==1&&j==1)
dp[i][j]=1;
else if(i==1)
dp[i][j]=dp[i][j-1]+buf[i][j];
else if(j==1)
dp[i][j]=dp[i-1][j]+buf[i][j];
else
dp[i][j]=min(dp[i-1][j],dp[i][j-1])+buf[i][j];
}
}
cout<<dp[5][5]<<endl;
return 0;
}


当然还可进行空间优化,我们现在使用一维数组dp[5],这自己慢慢体会。。
    #include <iostream>
    #include <string>
    #include <string.h>
    #include <vector>
    #include<iomanip>
    #include <math.h>
    #include <algorithm>
    using namespace std;
    int buf[5][5]={
    0,0,0,0,0,
    0,1,3,5,9,
    0,8,1,3,4,
    0,5,0,6,1,
    0,8,8,4,0,
    };
    int dp[5]={0};
     
    int main(int argc, char *argv[])
    {
    for(int i=1;i<=5;i++)
    {
    for(int j=1;j<=5;j++)
    {
    if(i==1&&j==1)
    dp[j]=1;
    else if(i==1)
    dp[j]=dp[j-1]+buf[i][j];
    else if(j==1)
    dp[j]=dp[j]+buf[i][j];
    else
    dp[j]=min(dp[j],dp[j-1])+buf[i][j];
    }
    }
    cout<<dp[5]<<endl;
    return 0;
    }




0 0
原创粉丝点击