dfs肯定跑不出来 这种一般都是动态规划
左边的数小 上边的数小
从小到大 对于每个新的数 要么紧挨着放在上边一行 要么紧挨着放在下边一行
放在上面当然没有问题
如果放在下边,前提需要上边有数才行,所以不能出现下面个数大于上面个数的情况
dp【i】【j】:上边i个数,下边一行j个数的可能的情况数
递推公式dp【i】【j】=dp【i-1】【j】+dp【i】【j-1】 (i大于等于j)
初始化边界:dp【0】【0】=1 上边一行和下边一行都没数的情况算一种
一个新的数 dp【i】【j】
放在上边 dp【i】【j】+= dp【i-1】【j】
放在下边 dp【i】【j】+= dp【i】【j-1】
填完这个 1010*1010 的表最后的 dp【1010】【1010】
就是答案
#include <iostream>
using namespace std;
int f[1020][1020];
int main()
{
f[0][0]=1;
for(int i=1;i<=1010;i++)//上面一行可以放1~1010个
for(int j=0;j<=i;j++)//下面一行放的范围是0~i 不能比上面多哦
{
f[i][j]+=f[i-1][j]%2020;//可以把i+j这个数紧挨着放上面
if(j)
f[i][j]+=f[i][j-1]%2020;//也可以放下面 注意不要越界
}
cout<<f[1010][1010]<<endl;
return 0;
}
#include <iostream>
using namespace std;
int f[1020][1020];
int main(){
f[0][0]=1;
for(int i=0;i<=1010;i++)
for(int j=0;j<=1010;j++){
if(i-1>=j)//上边一行的数要多于下边一行 才能往上边放
f[i][j]+=f[i-1][j]%2020;
if(j)
f[i][j]+=f[i][j-1]%2020;
}
cout<<f[1010][1010]<<endl;
return 0;
}