题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1502
题目大意:找出总的满足条件的字符串数,num(a)=num(b)=num(c)且任何前缀均满足num(a)>=num(b)>=num(c)
解题思路:用dp[i][j][k]表示a取i个,b取j个,c取k个的状态下最多有多少种满足条件的情况,容易推得状态转移方程如下:
dp[i][j][k]=dp[i-1][j][k](i>j时)+dp[i][j-1][k](j>k时)+dp[i][j][k-1](k>0时)
根据该状态转移方程即可输出最后的结果dp[n][n][n]
因为本题的数据结果比较大,所以还需要用到高精度,对不会用java的人就只能手敲一个大数相加了。。。
1 #include<cmath> 2 #include<cstdio> 3 #include<cstring> 4 #include<iostream> 5 #include<algorithm> 6 #define scan(a) scanf("%d",&a) 7 using namespace std; 8 #define N 61 9 char dp[N][N][N][100],a[100]; 10 void init() 11 { 12 strcpy(dp[0][0][0],"1 "); 13 strcpy(dp[1][1][0],"1 "); 14 strcpy(dp[1][0][1],"0 "); 15 strcpy(dp[1][0][0],"1 "); 16 } 17 18 void add(char *p) 19 { 20 int x,l,i,jin=0; 21 l=strlen(a); 22 int now=0; 23 for(i=0;p[i]!='