http://acm.hdu.edu.cn/showproblem.php?pid=1978
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 3022 Accepted Submission(s): 1771

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
3948
题意:
自己看。
分析:
简单的计数原理,用加法原理即可,dp[Target]+=dp[Source]。
/*
*
* Author : fcbruce <fcbruce8964@gmail.com>
*
* Time : Thu 30 Oct 2014 11:03:13 AM CST
*
*/
#include <cstdio>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <algorithm>
#include <ctime>
#include <cctype>
#include <cmath>
#include <string>
#include <cstring>
#include <stack>
#include <queue>
#include <list>
#include <vector>
#include <map>
#include <set>
#define sqr(x) ((x)*(x))
#define LL long long
#define itn int
#define INF 0x3f3f3f3f
#define PI 3.1415926535897932384626
#define eps 1e-10
#ifdef _WIN32
#define lld "%I64d"
#else
#define lld "%lld"
#endif
#define maxm
#define maxn 107
using namespace std;
int G[maxn][maxn],dp[maxn][maxn];
inline int add(int a,int b)
{
return (a+b)%10000;
}
int main()
{
#ifdef FCBRUCE
freopen("/home/fcbruce/code/t","r",stdin);
#endif // FCBRUCE
int T_T;
scanf("%d",&T_T);
while (T_T--)
{
int n,m;
scanf("%d%d",&n,&m);
for (int i=0;i<n;i++)
for (int j=0;j<m;j++)
scanf("%d",&G[i][j]);
memset(dp,0,sizeof dp);
dp[0][0]=1;
for (int i=0;i<n;i++)
{
for (int j=0;j<m;j++)
{
for (int k=0;k<=G[i][j];k++)
{
for (int l=0;l<=G[i][j]-k;l++)
{
if ((k||l) && i+k<n && j+l<m)
dp[i+k][j+l]=add(dp[i+k][j+l],dp[i][j]);
}
}
}
}
printf("%d\n",dp[n-1][m-1]);
}
return 0;
}
HDU 1978 How many ways (DP,计数)
原文地址:http://blog.csdn.net/u012965890/article/details/40616969