HDU 1502
- A©>= B© >= C© .
- dp[i][j][k] i,j,k分别表示A,B,C的个数,dp值表示在这种条件下符合条件的种类
- 那么可以得到转移方程是
- dp[i][j][k]=dp[i-1][j][k]+dp[i][j-1][k]+dp[i][j][k-1](i>=j>=k)
- dp[0][0][0]=1;
#include<bits/stdc++.h>
using namespace std;
string dp[61][61][61];
string sum(string a,string b)
{
if(a.length()<b.length())
{
swap(a,b);
}
for(int i=a.length()-1,j=b.length()-1;i>=0;i--,j--)
{
a[i]=a[i]+(j>=0?b[j]-'0':0);
if(a[i]-'0'>9)
{
a[i]=(a[i]-'0')%10+'0';
if(i) a[i-1]++;
else a="1"+a;
}
}
return a;
}
int main()
{
for(int i=0;i<=60;i++)
{
for(int j=0;j<=60;j++)
{
for(int k=0;k<=60;k++)
{
dp[i][j][k]="0";
}
}
}dp[0][0][0]="1";
for(int i=0;i<=60;i++)
{
for(int j=0;j<=i;j++)
{
for(int k=0;k<=j;k++)
{
if(i!=0) dp[i][j][k]=sum(dp[i][j][k],dp[i-1][j][k]);
if(j!=0) dp[i][j][k]=sum(dp[i][j][k],dp[i][j-1][k]);
if(k!=0) dp[i][j][k]=sum(dp[i][j][k],dp[i][j][k-1]);
}
}
}
int n;while(~scanf("%d",&n))
{
cout<<dp[n][n][n]<<endl<<endl;
}
}