首页 > 其他 > 详细

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

时间:2015-11-22 15:50:32      阅读:312      评论:0      收藏:0      [点我收藏+]

题目链接: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

 

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

原文:http://www.cnblogs.com/zhengguiping--9876/p/4985790.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!