洛谷 P1722 矩阵 II C语言 记忆化搜索
题目:
https://www.luogu.com.cn/problem/P1722
我们按照案例画一下
我们会发现,会出现重复的子结构。
代码如下:
#include<iostream>
using namespace std;
int mem[300][300];
int n;
int f[305][305];
int dfs(int x,int red,int black)//x为当前格子数量,red,black分别表示为红球和黑球的数量
{
if(black > red || red > n)
return 0;
if(x == 2*n)
{
if(red == n)
return 1;
else
return 0;
}
if(mem[red][black])
return mem[red][black];
int t = 0;
t = (dfs(x+1,red+1,black)+dfs(x+1,red,black+1))%100;
mem[red][black] = t;
return t;
}
int main(void)
{
cin >> n;
int ans = dfs(0,0,0);
cout << ans;
return 0;
}
动态规划:
#include<iostream>
using namespace std;
int n;
int f[305][305];
int main(void)
{
cin >> n;
//可以转化成有当前有i个格子有几个红色球 f[i][red]a
f[1][1] = 1;
for(int i = 2 ; i <= 2*n ; i++)
{
for(int red = (i+1)/2 ; red <= i; red++)
{
f[i][red] = (f[i-1][red-1] + f[i-1][red])%100;
}
}
cout << f[2*n][n];
return 0;
}
红球的范围是生成可能和不可能的答案,但是动态规划是选择最优子结构,会筛选不可能的答案,并且不能能的答案值是0.