题目大意:
思路:
1.DFS
考场推了半天这道题,没发现什么规律,于是打了一个DFS就跑。。。
#include <iostream>
using namespace std;
int n;
long long sum;
void dfs(int x,int k)
{
if (x>n||k==0)
{
sum++;
return;
}
for (int i=0;i<=min(k,n-x+1);i++) dfs(x+1,i);
}
int main()
{
cin>>n;
dfs(1,999);
cout<<sum-1;
return 0;
}
2.打表
深搜不行,打个表不行?
事实证明:还是不行。。。
当n>20时DFS就跑不动了,等了20min都没出来。。。
#include <cstdio>
using namespace std;
int main()
{
scanf("%d",&n);
if(n==1) puts("1");
if(n==2) puts("4");
if(n==3) puts("13");
if(n==4) puts("41");
if(n==5) puts("131");
if(n==6) puts("428");
if(n==7) puts("1429");
if(n==8) puts("4861");
if(n==9) puts("16795");
if(n==10) puts("58785");
if(n==11) puts("208011");
if(n==12) puts("742899");
if(n==13) puts("2674439");
if(n==14) puts("9694844");
if(n==16) puts("129644789");
if(n==17) puts("477638699");
if(n==18) puts("1767263189");
return 0;
}
3.DP
正解出场!!!
首先,要用高精度!
方程:f[i][j][k]=f[i-1][j][k]+f[i][j-1][k]+t;
代码:
#include <cstdio>
using namespace std;
const int maxn=100;
int n,f[101][101][maxn+1],t,o,a[maxn+1];
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
f[i][0][maxn]=1; //初始化
for (int j=1;j<=i;j++)
{
t=0; //进位
for (int k=maxn;k>=1;k--) //高精度
{
f[i][j][k]=f[i-1][j][k]+f[i][j-1][k]+t;
t=f[i][j][k]/10;
f[i][j][k]%=10;
}
}
}
for (int i=1;i<=n;i++)
for (int j=maxn;j>=1;j--) //求第一行有n个的情况的总和(即答案)
{
o=f[n][i][j]+a[j]+t;
t=o/10;
a[j]=o%10;
}
int i=1;
while (a[i]==0) i++;
for (int j=i;j<=maxn;j++) printf("%d",a[j]); //高精度专用输出
return 0;
}