POJ 2353 Ministry [DP]

原创 2012年03月22日 18:48:44

题意:

给定一个m x n矩阵,要求从上到下寻找一条最短路径,这条最短路径顺序必须是从小到下,每一层的时候向左向右都行。


思路:

申请数组如下:

dp [ i ] [ j ] :抵达第i层第j个点的最小消耗。

pre [ i ] [ j ]:抵达第i层第j个点的前一个点,即保存路径。因为每个点的pre点只有三种情况,上左右,所以当 pre [ i ] [ j ]==j时,即代表是上,j-1是左。j+1是右。


转移方程:

先是从左到右:dp [ i ][ j ]=Min(dp[ i-1 ][ j ],dp[ i ][ j-1])+w;

再是从右到左:dp [ i ][ j ]=Min(dp[ i ][ j ],dp[ i ][ j+1] + w );


这样的时间复杂度为O(m*n);


挺不错的一道题目。

还是一次AC,今天人品不错。

#include<iostream>
#include<vector>
#include<string>
#include<queue>
#include<cmath>
#include<algorithm>
#define llong long long
#define Min(a,b) (a<b?a:b)
#define Max(a,b) (a>b?a:b)
#define Abs(a) ((a)>0?(a):-(a))
#define Mod(a,b) (((a)-1+(b))%(b)+1)
using namespace std;
int n,m;
const int N=505;
const int M=105;
const int inf=2099999999;
int dp[M][N];
int a[M][N];
int pre[M][N];
void myprint(int i,int j)
{
	if(i==1)
	{
		printf("%d\n",j);
		return;
	}
	if(pre[i][j]==j)
	{
		myprint(i-1,j);
	}
	else
	{
		myprint(i,pre[i][j]);
	}
	printf("%d\n",j);
}
int main()
{
	scanf("%d%d",&m,&n);
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
		{
			scanf("%d",a[i]+j);
		}
	for(int j=1;j<=n;j++)
		dp[1][j]=a[1][j];
	for(int i=1;i<=m;i++)
		dp[i][0]=dp[i][n+1]=inf;
	for(int i=2;i<=m;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(dp[i-1][j]<dp[i][j-1])
			{
				dp[i][j]=dp[i-1][j]+a[i][j];
				pre[i][j]=j;
			}
			else
			{
				dp[i][j]=dp[i][j-1]+a[i][j];
				pre[i][j]=j-1;
			}
		}
		for(int j=n;j>=1;j--)
		{
			if(dp[i][j]>dp[i][j+1]+a[i][j])
			{
				dp[i][j]=dp[i][j+1]+a[i][j];
				pre[i][j]=j+1;
			}
		}
	}
	int ans=inf,k=0;
	for(int i=1;i<=n;i++)
		if(dp[m][i]<ans)
		{
			ans=dp[m][i];
			k=i;
		}
	myprint(m,k);
	return 0;
}


POJ 2353 Ministry DP

很经典的DP,做法就不多说了。我只是想吐槽,为什么该WA的判d
  • ACMmaxx
  • ACMmaxx
  • 2014年07月15日 09:53
  • 397

POJ 2353 Ministry(双向DP)

/* 题意:矩形M*N,要求:只能向下、向左、向右走,求从第一层到最后一层费用最小的路径。 思路:双向DP(其实就是两个for循环),因为最佳路径只有三种从上、从左、从右,所以只需要三个循环即可 原...
  • lhshaoren
  • lhshaoren
  • 2012年09月06日 16:52
  • 1011

poj 2353 Ministry

两遍dp,从两端各走一遍 dp[i][j]=min(dp[i][j],dp[i][j+1]+a[i][j]);
  • smz436487
  • smz436487
  • 2014年05月22日 15:51
  • 219

DP专题5 POJ 2353 Ministry

传送门:http://poj.org/problem?id=2353 翻译:      Mr. F. 想让部长批阅签署一份文件。但只有当部长的下属部门核准后,部长才签署一份文件。部门是一座M层的建...
  • longchanglin0609
  • longchanglin0609
  • 2012年07月20日 16:18
  • 337

poj 2353 Ministry 对规划方向有要求的dp

//poj 2353 //sep9 #include using namespace std; int dp[128][512],cost[128][512],path[128][512]; int ...
  • sepNINE
  • sepNINE
  • 2015年10月08日 00:27
  • 295

poj 2353 简单dp

对于每一层,从两头分别计算一遍就行。 #include #include #include #include using namespace std; const long long inf=((l...
  • suressay
  • suressay
  • 2013年03月08日 12:09
  • 414

poj 2353 双向DP

水题。 从左和 到右,
  • u013983192
  • u013983192
  • 2014年08月12日 20:43
  • 315

POJ 2353 DP

双向DP+记录路径。// by SiriusRen #include #include #include using namespace std; stacks; int n,m,RECL,RE...
  • qq_31785871
  • qq_31785871
  • 2016年08月04日 18:59
  • 101

POJ-DP题目列表【开启疯狗模式】

转载请注明出处:http://blog.csdn.net/a1dark DP是大伤、终于找到一份可以狂刷的清单、那便战个痛! 列表一:经典题目题号: 容易:  1018, 1050, ...
  • verticallimit
  • verticallimit
  • 2013年12月04日 11:05
  • 2026

POJ dp题目列表

=▽=
  • Clove_unique
  • Clove_unique
  • 2016年10月18日 21:47
  • 549
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ 2353 Ministry [DP]
举报原因:
原因补充:

(最多只允许输入30个字)