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;
}
这道题猛一看是搜索,但是搜索的话一般会超时
这里就用到了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;
}
相关文章推荐
- hihocoder 1702 矩阵迷宫(DP)
- 矩阵迷宫 HihoCoder - 1702
- 矩阵迷宫 HihoCoder - 1702 DP解法
- hihocoder#1702 : 矩阵迷宫(DP)
- 矩阵乘法-vijos1603迷宫
- 迷宫--矩阵中任意两点之间最短路-4个方向(dfs)
- hihoCoder - 1519 : 逃离迷宫II(宽搜)
- 【数学&矩阵加速】hihocoder1555 四次方根
- 【hihocoder [Offer收割]编程练习赛9 D】【简单DP】矩阵填数
- hihocoder第41周 骨牌覆盖(矩阵快速幂)
- 迷宫2--矩阵中任意两点最短路(8个方向) dfs 效率很低
- HihoCoder 1504 : 骑士游历 (矩阵乘法)
- hihoCoder 1143 : 骨牌覆盖问题·一 矩阵快速幂
- hihoCoder 1143 : 骨牌覆盖问题·一(递推,矩阵快速幂)
- hihocoder 1124 : 好矩阵 dp
- 【HIHOCODER 1599】逃离迷宫4
- hihoCoder 1143 矩阵快速幂
- hihocoder 1555 四次方根(矩阵快速幂)
- 迷宫矩阵(最优路径算法)
- HihoCoder 1151 矩阵快速幂 + 取模