您的位置:首页 > 其它

【动态规划】【记忆化搜索】CODEVS 1010 过河卒 2002年NOIP全国联赛普及组

2014-10-28 10:22 477 查看
f(i,j)=f(i-1,j)+f(i,j-1),显然可以暴力递归求解,但是很多重复的状态,所以可以记忆下来。

注意障碍点和边界的特判。

#include<cstdio>
#include<cstring>
using namespace std;
int x1,y1,x2,y2,dp[25][25];
bool a[25][25];
const int dx[]={1,-1,1,-1,2,-2,2,-2},dy[]={2,2,-2,-2,1,1,-1,-1};
int f(int x,int y)
{
if(dp[x][y]!=-1) return dp[x][y];
if(a[x][y]) return dp[x][y]=0;
if(x==0) return dp[x][y]=f(x,y-1);
if(y==0) return dp[x][y]=f(x-1,y);
return dp[x][y]=f(x-1,y)+f(x,y-1);
}
int main()
{
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
a[x2][y2]=true;
for(int i=0;i<8;i++)
{
int tx=x2+dx[i],ty=y2+dy[i];
if(tx>=0&&ty>=0) a[tx][ty]=true;
}
memset(dp,-1,sizeof(dp));
dp[0][0]=(a[0][0] ? 0 : 1);
printf("%d\n",f(x1,y1));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: