问题描述
在 2 行 5 列的格子中填入 1 到 10 的数字。要求:
相邻的格子中的数,右边的大于左边的,下边的大于上边的。
如图所示的 2 种,就是合格的填法。
请你计算一共有多少种可能的方案。
答案提交
请提交该整数,不要填写任何多余的内容(例如:说明性文字)。
答案:42
题解一
DFS:
#include <iostream>
using namespace std;
int a[10][10], ans;
bool st[15];
bool judge(int x, int y)
{
if(x == 0)
{
if(a[x][y] > a[x][y - 1] || y == 0) return true;
}
if(a[x][y] > a[x][y - 1] && a[x][y] > a[x - 1][y] || y == 0 && a[x][y] > a[x - 1][y]) return true;
return false;
}
void dfs(int x, int y)
{
if(x == 2) ans ++;
for (int i = 1; i <= 10; i ++)
if(!st[i])
{
a[x][y] = i;
if(judge(x, y))
{
st[i] = true;
if(y == 4) dfs(x + 1, 0);
else dfs(x, y + 1);
st[i] = false;
}
}
}
int main()
{
dfs(0, 0);
cout << ans << endl;
return 0;
}
题解二
动态规划:
#include <iostream>
using namespace std;
int f[10][10];
int main()
{
f[0][0] = 1;
for (int i = 0; i <= 5; i ++)
for (int j = 0; j <= 5; j ++)
{
if(i - 1 >= j) f[i][j] += f[i - 1][j];
if(j) f[i][j] += f[i][j - 1];
}
cout << f[5][5] << endl;
return 0;
}
ps:15 年国赛的题目改一改又变成了 20 年的省赛题 😆