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;
}
//两条路一起来个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
- HDU 2686 Matrix (多线程DP)
- hdu 2686 Matrix (多线程dp)
- HDU 2686 Matrix(多线程DP)
- hdu 2686 Matrix【多线程DP】
- 【DP】 HDU 2686 Matrix 多线程DP
- HDU 2686 Matrix By Assassin 多线程dp
- Matrix - HDU 2686 dp
- hdu 2686 Matrix - 最小费用最大流 或 多线程DP
- hdu 2686 Matrix(最大费用流||多线程DP)@
- 多线程dp hdu2686 Matrix
- hdu 2686 Matrix ( 多进程DP)
- hdu 2686 Matrix 双线程dp
- HDU 2686 Matrix (双线程DP)
- hdu 2686 Matrix(双线程DP)
- HDU-2686 Matrix 双线程DP
- HDU 2686 Matrix(双线程DP)
- HDU 5569 matrix(DP)
- hdu 5569 matrix(dp)
- UVa 10392 - Factoring Large Numbers
- Java程序挂掉的几种可能
- QT静态库和动态库的导出
- Struts2教程7:上传任意多个文件
- 黑马程序员—静态概述
- hdu 2686 Matrix (多线程dp)
- 一道SQL的面试题之联想
- leetcode day5 -- Reorder List && Linked List Cycle II
- Codeforces Round #243 (Div. 2) Problem B - Sereja and Mirroring 题解
- Shapefile文件组成,Shapefile文件的修复
- 蓝桥杯——奇怪的比赛
- 玛雅~终于开始勤奋了特闷
- 感觉很是不适应呢
- Linux的NPTL