hdu 2686 Matrix (多线程dp)

来源:互联网 发布:淘宝店名名字 编辑:程序博客网 时间:2024/05/01 08:47
//多线程dp   看起来就是记忆化搜索
//两条路一起来个dfs()
//dp[x1][y1][x2][y2] 记录两个点的坐标




#include<stdio.h>
#include<string.h>


#define N 50
#define max(a,b) ((a)>(b))?(a):(b);


int mat[N][N];
int dp[N][N][N][N],n;
int dir[4][4]={1,0, 1,0, 1,0, 0,1, 0,1, 1,0, 0,1, 0,1 };
void init()
{
    memset(mat,-1,sizeof(mat));
    memset(dp,-1,sizeof(dp));
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=n;j++)
        {
            scanf("%d",&mat[i][j]);
        }
    }
    return;


}


int dfs(int x1,int y1,int x2,int y2)
{
    if(mat[x1][y1]==-1||mat[x2][y2]==-1)return 0;//越界返回0
    if(x1+y1==n+n) return mat[n][n];// 两条路会同时到达 mat[n][n] 只返回一个值不能x2
    if(dp[x1][y1][x2][y2]!=-1)return dp[x1][y1][x2][y2];// 搜索过的状态直接返回
    if(x1==x2&&y1==y2&& x1+y1>2) return 0;// 除了起始位置(1,1)两条路上的点不能再相遇
    int i,a,b,c,d,temp,ans=0;


    for(i=0;i<4;i++)//四种方向组合 右右 右下 下右 下下
    {
        a=x1+dir[i][0];
        b=y1+dir[i][1];
        c=x2+dir[i][2];
        d=y2+dir[i][3];
        temp=dfs(a,b,c,d);
        ans=max(ans,temp);


    }
     
     return dp[x1][y1][x2][y2]=ans+mat[x1][y1]+mat[x2][y2];


}
int solve()
{
    return dfs(1,1,1,1)-mat[1][1];
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        init();
        int ans=solve();
        printf("%d\n",ans);
    }
    return 0;
}
0 0
原创粉丝点击