hdu 2125 Local area network

1.题目

http://acm.hdu.edu.cn/showproblem.php?pid=2125

2.分析

类似二维阶梯的问题,只不过需要处理缺陷点的问题;注意缺陷点的横纵坐标的标识,不能想当然的自己感觉;动态规划所使用的决策:左边和下边的数值之和;

3.复杂度

空间复杂度O(MN);时间复杂度O(MN);

4.涉及内容

算法:动态规划

5.感想

类似二维阶梯的问题,感觉一些经典的题目需要反复做,来培养自己的感觉;

6.代码

#include <iostream>
using namespace std;
long f2125[40][40];
void init2125(int n,int m,int &x1,int &y1,int &x2,int &y2)
{
	int tempxy;
	if(x1==x2 && y1>y2) { tempxy=y1;	y1=y2;	y2=tempxy; }
	else if(y1==y2 && x1>x2) { tempxy=x1;	x1=x2;	x2=tempxy; }
	memset(f2125,0,sizeof(f2125));
	f2125[0][0]=1;
	for(int i=1;i<n;++i)//行
	{
		f2125[i][0]=f2125[i-1][0];
		if(i==x2 && y2==0 && i-1==x1 && y1==0) f2125[i][0]=0;
	}
	for(int j=1;j<m;++j)//列
	{
		f2125[0][j]=f2125[0][j-1];
		if(0==x2 && y2==j && j-1==y1 && x1==0) f2125[0][j]=0;
	}
}
int main()
{
	//freopen("in.txt","r",stdin);
	int n,m,x1,y1,x2,y2;
	while(cin>>n>>m)
	{
		cin>>x1>>y1>>x2>>y2;
		init2125(n,m,y1,x1,y2,x2);
		for(int i=1;i<n;++i)//行
			for(int j=1;j<m;++j)//列
			{
				if(i==y2 && i-1==y1 && x1==j && x2==j) f2125[i][j]=f2125[i][j-1];
				else if(i==y2 && i==y1 && x1==j-1 && x2==j) f2125[i][j]=f2125[i-1][j];
				else f2125[i][j]=f2125[i-1][j]+f2125[i][j-1];
			}
		cout<<f2125[n-1][m-1]<<endl;
	}
	return 0;
}

7.参考文献

你可能感兴趣的:(hdu 2125 Local area network)