Hust oj 1812 小乐乐想出门(基础dp)

小乐乐想出门
Time Limit: 1000 MS Memory Limit: 32768 K
Total Submit: 248(158 users) Total Accepted: 193(154 users) Rating: Special Judge: No
Description
大家可能不知道,小乐乐的家好大好大,可是好乱好乱。下面那个矩阵就是她家的简化图,每一个格子表示一个房间,格子里的数字表示穿过这个房间需要的力气。小乐乐的卧室在左上角,而大门却在右下角。所以小乐乐得穿过一些房间才能出门。小乐乐有个习惯,她只会向下走或者向右走。小乐乐很懒,她想知道以最省力的方式出门需要花费多少力气?
Input
第一行输入一个整数n(1<n<1000)
随后n行,每行n个整数。表示小乐乐的家
其中,左上角和右下角保证为0.
Output
输出最小力气的值。
Sample Input
3
0 3 7
6 2 1
9 8 0
8
0 3253 3165 9415 3108 7744 8869 1768
347 6410 8 5465 9733 1529 2584 9148
552 8569 2569 288 7211 5335 6652 2144
8203 683 8868 7178 8045 3430 9283 6498
2196 5533 2772 2376 7221 1861 5743 647
217 2159 9000 5584 7908 3861 1064 7431
7444 6086 3073 9035 6379 3198 12 3916
7248 7482 7286 6824 9747 539 6282 0
Sample Output
6

35973


基础dp,状态转移方程很好想,但要注意边界处理,因为这个WA了一发

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

int dp[1005][1005];
int a[1005][1005];
int Min(int y,int x)
{
    return x<y?x:y;
}
int main()
{
    int i,j,k;
    int n;
    while(cin>>n)
    {
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                cin>>a[i][j];
            }
        }
        dp[0][0]=a[0][0];
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                if(i==0&&j!=0)
                    dp[i][j]=dp[i][j-1]+a[i][j];
                else if(j==0&&i!=0)
                    dp[i][j]=dp[i-1][j]+a[i][j];
                else if(i!=0&&j!=0)
                    dp[i][j]=Min(dp[i-1][j],dp[i][j-1])+a[i][j];//状态转移方程
            }
        }
        cout<<dp[n-1][n-1]<<endl;
    }
}



你可能感兴趣的:(dp)