[DP]NOIP2002/FJSDFZOJ 1081 过河卒

本文分享了一道经典的DP递推题目解决方案,通过C++实现,详细展示了如何使用递推思想来解决特定类型的数学问题,并提供了非完美版的源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


原题:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1081


时间:2014.1.24


类型:dp 递推


源码:非完美版(不支持20,20的极限数据)

#include<iostream>
#include<cstring>
using namespace std;
long long a[20][20];
int main()
{
	int n,m,x,y;
	cin>>n>>m>>x>>y;
	memset(a,-1,sizeof(a));
	if(x-1>=0&&y-2>=0) { a[x-1][y-2]=0;}
	if(x-2>=0&&y-1>=0) { a[x-2][y-1]=0;}
	if(x-2>=0&&y+1<=m) { a[x-2][y+1]=0;}
	if(x-1>=0&&y+2<=m) { a[x-1][y+2]=0;}
	if(x+1<=n&&y+2<=m) { a[x+1][y+2]=0;}
	if(x+2<=n&&y+1<=m) { a[x+2][y+1]=0;}
	if(x+2<=n&&y-1>=0) { a[x+2][y-1]=0;}
	if(x+1<=n&&y-2>=0) { a[x+1][y-2]=0;}
	a[x][y]=0;
	for(int i=0;i<=n;i++)
	{
		if(a[i][0]==-1) { a[i][0]=1; }
		if(a[i][0]==0)
		{
			for(int j=i;j<=n;j++)
			{
				a[j][0]=0;
			}
		}
	}
	for(int i=0;i<=m;i++)
	{
		if(a[0][i]==-1) { a[0][i]=1; }
		if(a[0][i]==0)
		{
			for(int j=i;j<=m;j++)
			{
				a[0][j]=0;
			}
			break;
		}
	}
	for(int j=1;j<=m;j++)
	{
		for(int i=1;i<=n;i++)
		{
			if(a[i][j]==-1)
			{
				a[i][j]=0;
				a[i][j]+=a[i-1][j]+a[i][j-1];
			}
		}
	}
	cout<<a[n][m];
	//system("pause");
	return 0;
}

最后状态:VIJOS AC 福建师大附中OJ WA 17%


总结:经典,经典!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值