HDU 1978 How many ways

本文介绍了一种使用记忆化搜索解决特定路径计数问题的方法。通过C++代码实现,利用二维数组存储中间结果避免重复计算,提高算法效率。适用于解决网格中从起点到终点的路径数量问题。

这题是记忆化搜索:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int map[124][124];
int ans[124][124];
int N,M;
int DFS( int x ,int y )
{
int sum = 0;
if( x == N && y == M ) return 1;
if( ans[x][y]>=0 ) return ans[x][y];
for( int i=0; i<= map[x][y] ; i++ )
for( int j=0; j<= map[x][y]; j++ )
{
if( (i+j)<=map[x][y] && ( i + x )<=N && ( j + y )<=M && ( i+j )!=0 )
{
sum+=DFS( i + x , j+y );
sum %= 10000;
}
}
ans[x][y] = sum;
return sum;
}
int main( )
{
int n;
while( scanf( "%d",&n )==1 )
{
while( n-- )
{
scanf( "%d%d",&N, &M );
memset( map , 0 , sizeof( map ) );
memset( ans , -1 , sizeof( ans ) );
for( int i=1; i<= N; i++ )
for( int j= 1; j<=M ; j++ )
scanf( "%d",&map[i][j] );
printf( "%d\n",DFS( 1 ,1) );
}
}
return 0;
}

 

转载于:https://www.cnblogs.com/bo-tao/archive/2012/03/01/2376072.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值