题意:问第k个长度为n的01串是什么(不能有相邻的1)
分析:dp[i][0/1] 表示前i个,当前第i个放1或0的方案数,先预处理计算,dp[i][1]只能有dp[i-1][0]转移过来。k -= dp[n][0] 表示当前放0的方案数不够了,所以必须放1,那么dp[n][0]个方案数都不能用了,相当于k减去这么多。详细解释
代码:
#include <cstdio> #include <algorithm> #include <cmath> #include <cstring> #include <string> using namespace std; const int MAXN = 1e4 + 10; const int INF = 0x3f3f3f3f; int dp[50][2]; void solve(void) { memset (dp, 0, sizeof (dp)); dp[1][1] = 1; dp[1][0] = 1; for (int i=2; i<44; ++i) { dp[i][1] = dp[i-1][0]; dp[i][0] = dp[i-1][1] + dp[i-1][0]; } } int main(void) //URAL 1081 Binary Lexicographic Sequence { //freopen ("Q.in", "r", stdin); solve (); int n, k; while (scanf ("%d%d", &n, &k) == 2) { if (k > dp[n][1] + dp[n][0]) {puts ("-1"); continue;} while (n) { if (dp[n][0] >= k) { printf ("0"); } else {printf ("1"); k -= dp[n][0];} n--; } puts (""); } return 0; }