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.参考文献