hdu 1978

记忆搜索

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

题目简述:

机器人从第一个点出发到达最后一点,有多少种方法,结果%10000

Input

1

 6 6 

4 5 6 6 4 3 

2 2 3 1 7 2

1 1 4 6 2 7

5 8 4 3 9 5 

7 6 6 2 1 5 

3 1 1 3 7 2

Output

3948

第一种方法:

#include<iostream>
using namespace std;
int n,m;
int map[205][205];
int dp[205][205];
int min(int a,int b)
{
	return a<b?a:b;
}
int bfs(int x,int y,int k)
{
	int i,j;
	if(x==n&&y==m)
		return 1;
	if(dp[x][y]!=0)
		return dp[x][y];
	for(i=0;i<=min(k,n-x);i++)
	{
		for(j=0;j<=min(k-i,m-y);j++)
		{
			if(i==0&&j==0) continue;
			dp[x][y]+=bfs(x+i,y+j,map[x+i][y+j]);
			dp[x][y]%=10000;
		}	
	}
	return dp[x][y];
}
int main()
{
	int t;
	cin>>t;
	int i,j;
	while(t--)
	{
		cin>>n>>m;
		for(i=1;i<=n;i++)
		{
			for(j=1;j<=m;j++)
			{
				cin>>map[i][j];
			}
		}
		bfs(1,1,map[1][1]);
		cout<<dp[1][1]<<endl;
	}
	return 0;
}

 

第二种方法:  

#include<iostream>
#include<string>
using namespace std;
int dp[205][205];
int main()
{
	int t,i,j,k,l,a;
	cin>>t;
	while(t--)
	{
		int n,m;
		cin>>n>>m;
		memset(dp,0,sizeof(dp));
		dp[0][0]=1;
		for(i=0;i<n;i++)
		{
			for(j=0;j<m;j++)
			{
				cin>>a;
				for(k=0;k<=a;k++)
				{
					for(l=0;l<=a-k;l++)
					{
						if(l==0&&k==0) continue;
						dp[i+k][j+l]=(dp[i][j]+dp[i+k][j+l])%10000;
					}
				}
			}
		}
		cout<<dp[n-1][m-1]<<endl;
	}
	return 0;
}

 

 

 

转载于:https://www.cnblogs.com/wuyanjun/archive/2013/05/23/3095004.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值