动态规划例题

解析

很容易发现每一个点可以由左边或者下面得到,得出公式dp[i][j]=min(dp[i][j-1],dp[i+1][j])+mp[i][j];注意判断边界

代码

 

#include<bits/stdc++.h>
using namespace std;
int mp[100][100];
int dp[100][100];
int main()
{
    int xb,yb;
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            cin>>mp[i][j];
        }
    }
    for(int i=3;i>=1;i--)//左边(i,j-1)下面(i+1,j) 
    {
        for(int j=1;j<=3;j++)
        {
            if(i==3&&j==1) continue;
            if(j-1>0&&i+1<4)
            {
                dp[i][j]=min(dp[i][j-1],dp[i+1][j])+mp[i][j];
            }
            if(i==3) dp[i][j]=dp[i][j-1]+mp[i][j];
            if(j==1) dp[i][j]=dp[i+1][j]+mp[i][j];
        }
    }
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            cout<<dp[i][j]<<" "; 
        }
        cout<<endl;
    }
    cout<<dp[1][3]<<endl;
}

 

posted @ 2018-07-04 15:54  前排吃瓜  阅读(169)  评论(0编辑  收藏  举报