洛谷 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.

相关推荐
yuuki233233几秒前
【数据结构】常见时间复杂度以及空间复杂度
c语言·数据结构·后端·算法
闻缺陷则喜何志丹4 分钟前
【分块 差分数组 逆元】3655区间乘法查询后的异或 II|2454
c++·算法·leetcode·分块·差分数组·逆元
葛小白114 分钟前
C#进阶12:C#全局路径规划算法_Dijkstra
算法·c#·dijkstra算法
前端小L16 分钟前
图论专题(五):图遍历的“终极考验”——深度「克隆图」
数据结构·算法·深度优先·图论·宽度优先
CoovallyAIHub36 分钟前
超越像素的视觉:亚像素边缘检测原理、方法与实战
深度学习·算法·计算机视觉
CoovallyAIHub38 分钟前
中科大西工大提出RSKT-Seg:精度速度双提升,开放词汇分割不再难
深度学习·算法·计算机视觉
gugugu.39 分钟前
算法:位运算类型题目练习与总结
算法
百***97641 小时前
【语义分割】12个主流算法架构介绍、数据集推荐、总结、挑战和未来发展
算法·架构
代码不停1 小时前
Java分治算法题目练习(快速/归并排序)
java·数据结构·算法
bubiyoushang8881 小时前
基于MATLAB的马尔科夫链蒙特卡洛(MCMC)模拟实现方法
人工智能·算法·matlab