南大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意味着什么