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

相关推荐
小曹要微笑12 小时前
STM32H7系列全面解析:嵌入式性能的巅峰之作
c语言·stm32·单片机·嵌入式硬件·算法
寻星探路12 小时前
JavaSE重点总结后篇
java·开发语言·算法
松涛和鸣15 小时前
14、C 语言进阶:函数指针、typedef、二级指针、const 指针
c语言·开发语言·算法·排序算法·学习方法
yagamiraito_16 小时前
757. 设置交集大小至少为2 (leetcode每日一题)
算法·leetcode·go
星释16 小时前
Rust 练习册 57:阿特巴什密码与字符映射技术
服务器·算法·rust
无敌最俊朗@17 小时前
力扣hot100-141.环形链表
算法·leetcode·链表
WWZZ202519 小时前
快速上手大模型:深度学习10(卷积神经网络2、模型训练实践、批量归一化)
人工智能·深度学习·神经网络·算法·机器人·大模型·具身智能
sali-tec20 小时前
C# 基于halcon的视觉工作流-章62 点云采样
开发语言·图像处理·人工智能·算法·计算机视觉
fashion 道格20 小时前
用 C 语言玩转归并排序:递归实现的深度解析
数据结构·算法·排序算法
九年义务漏网鲨鱼1 天前
蓝桥杯算法——状态压缩DP
算法·职场和发展·蓝桥杯