算法刷题记录(Day 79)

原题链接1
原题链接2

南大2018题1

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

#include
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
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意味着什么

你可能感兴趣的:(算法刷题记录,算法,深度优先)