您的位置:首页 > 其它

HihoCoder - 1702 --矩阵迷宫

2018-03-31 10:47 169 查看
题目链接
这道题猛一看是搜索,但是搜索的话一般会超时
这里就用到了DP
因为只有向下和向右两个方向
这个和树形DP非常的像
dpr[i][j][k] 表示到达i  j点并拐弯K次且方向朝右的最小代价
dpd[1][i][j][k]表示到达i j  点并拐弯K次且方向朝下的最小代价#include<stdio.h>
#include<string.h>
#define For(a,b,c) for(int a = b; a <= c; a++)
#define INF 0x3f3f3f3f

int v[105][105], dpr[105][105][15], dpd[105][105][15];

int minn(int a, int b)
{
if(a < b) return a;
return b;
}

int pow(int k)
{
int ans = 1;
while(k--) ans <<= 1;
return ans;
}

int main()
{
int n;
scanf("%d",&n);
For(i,1,n)
For(j,1,n)
scanf("%d",&v[i][j]);

memset(dpr,0x3f,sizeof(dpr));
memset(dpd,0x3f,sizeof(dpd));

dpr[1][1][0] = v[1][1];
dpd[1][1][0] = v[1][1];

//好像不初始化也没问题,下面从(1,1)开始也可以,应该不会有越界问题,不过还是稳一手
For(i,2,n) //初始化朝右走的第一行权值,朝下走第一列权值
{
dpr[1][i][0] = dpr[1][i-1][0] + v[1][i];
dpd[i][1][0] = dpd[i-1][1][0] + v[i][1];
}

For(i,2,n)
{
For(j,2,n)
{
dpr[i][j][0] = dpr[i][j-1][0] + v[i][j]; //防止k越界
dpd[i][j][0] = dpd[i-1][j][0] + v[i][j];

For(k,1,13)
{
//文字描述感觉不如代码,直接看代码吧
dpr[i][j][k] = minn(dpd[i][j-1][k-1]+pow(k-1) , dpr[i][j-1][k]) + v[i][j];
dpd[i][j][k] = minn(dpd[i-1][j][k] , dpr[i-1][j][k-1]+pow(k-1)) + v[i][j];
}
}
}

int ans = INF;
For(k,0,13)
{
ans = minn(dpd

[k], ans);
ans = minn(dpr

[k], ans);
}
printf("%d\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划