matrix---简单dp,边界边界-_-

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5569

简单dp,恶心的边界处理,无语;

if((i+j)%2==1)

dp[i][j]=a[i-1][j]*a[i][j]+min(dp[i-2][j], dp[i-1][j-1]);
dp[i][j]=min(dp[i][j], a[i][j-1]*a[i][j]+min(dp[i-1][j-1], dp[i][j-2]));

 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<map>
#include<cmath>
#include<queue>
using namespace std;
#define N 1005
#define INF 0x3f3f3f3f

int a[N][N],dp[N][N], m, n;

int main()
{
    while(scanf("%d %d", &m, &n)!=EOF)
    {
        for(int i=0; i<N; i++)
            for(int j=0; j<N; j++)
                dp[i][j]=INF;

        for(int i=1; i<=m; i++)
            for(int j=1; j<=n; j++)
                scanf("%d", &a[i][j]);
                
        dp[1][1]=0;
        dp[1][2]=a[1][1]*a[1][2];
        dp[2][1]=a[1][1]*a[2][1];
        for(int i=3; i<=m; i++)
        {
            dp[i][1]=dp[i-2][1]+a[i][1]*a[i-1][1];
            dp[i][2]=min(a[i][1]*a[i][2]+dp[i-1][1],a[i-1][2]*a[i][2]+min(dp[i-1][1], dp[i-2][2]));
        }
        for(int i=3; i<=n; i++)
        {
            dp[1][i]=dp[1][i-2]+a[1][i]*a[1][i-1];
            dp[2][i]=min(a[1][i]*a[2][i]+dp[1][i-1],a[2][i-1]*a[2][i]+min(dp[1][i-1], dp[2][i-2]));
        }

        for(int i=3; i<=m; i++)
        {
            for(int j=3; j<=n; j++)
            {
                if((i+j)%2==1)
                {
                    dp[i][j]=a[i-1][j]*a[i][j]+min(dp[i-2][j], dp[i-1][j-1]);
                    dp[i][j]=min(dp[i][j], a[i][j-1]*a[i][j]+min(dp[i-1][j-1], dp[i][j-2]));
                }
            }
        }
        printf("%d\n", dp[m][n]);
    }
    return 0;
}
/*
3 4
1 2 3 7
4 5 6 8
10 11 12 9

92
*/
View Code

 

posted @ 2015-11-22 14:19  西瓜不懂柠檬的酸  Views(304)  Comments(0Edit  收藏  举报
levels of contents