算法刷题记录(Day 79)

本文提供两道编程题的解决方案:一是利用动态规划计算特定长度且不含连续1的二进制串数量;二是采用深度优先搜索解析字符串,确保解码后的整数序列不重复且不超过给定上限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接1
原题链接2

南大2018题1

题目类型:动态规划
给定一个正整数n(3≤n≤90),数出长度为n的所有可能的不同二进制串的个数,使得串中没有连续的1出现。

#include<iostream>
using namespace std;
#define NMAX 99
typedef long long LL;
LL dp[NMAX][2];
int n;
int main() {
	cin >> n;
	dp[1][1] = 1;
	dp[1][0] = 1;
	for (int i = 2; i <= n; i++) {
		dp[i][0] = dp[i - 1][0] + dp[i - 1][1];
		dp[i][1] = dp[i - 1][0];
	}
	cout << dp[n][0] + dp[n][1] << endl;
}

南大2018题2

题目类型:dfs

#include<iostream>
using namespace std;
#define NMAX 44
int n;
string s;
int is[NMAX];
int res;
int dfs(int pointer) {
	if (pointer == s.size()) {
		for (int i = 1; i <= n; i++) {
			if (!is[i]) {
				res = i;
				break;
			}
		}
		return 1;
	}
	if (s[pointer] - '0'<=n && s[pointer] - '0'>0 && !is[s[pointer] - '0']) {//0不能用来开头
		//单个产生的数没有存在
		is[s[pointer] - '0'] = 1;
		if (dfs(pointer + 1)) {
			//cout << s[pointer] - '0' << " ";
			return 1;
		}
		is[s[pointer] - '0'] = 0;
	}
	if (s[pointer] - '0' && pointer + 1 < s.size()) {
		int curnum = (s[pointer] - '0') * 10 + s[pointer + 1] - '0';
		if (curnum<=n && !is[curnum]) {
			is[curnum] = 1;
			if (dfs(pointer + 2)) {
				//cout << curnum << " ";
				return 1;
			}
			is[curnum] = 0;
		}
	}
	return 0;
}
int main() {
	cin >> n >> s;
	memset(is, 0, sizeof(is));
	dfs(0);
	cout <<endl <<  res << endl;
}

tip:注意判断条件,以及进行到当前的dfs意味着什么

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值