递推DP URAL 1081 Binary Lexicographic Sequence
2015-05-10 17:02
330 查看
题目传送门
题意:问第k个长度为n的01串是什么(不能有相邻的1)
分析:dp[i][0/1] 表示前i个,当前第i个放1或0的方案数,先预处理计算,dp[i][1]只能有dp[i-1][0]转移过来。k -= dp
[0] 表示当前放0的方案数不够了,所以必须放1,那么dp
[0]个方案数都不能用了,相当于k减去这么多。详细解释
代码:
题意:问第k个长度为n的01串是什么(不能有相邻的1)
分析:dp[i][0/1] 表示前i个,当前第i个放1或0的方案数,先预处理计算,dp[i][1]只能有dp[i-1][0]转移过来。k -= dp
[0] 表示当前放0的方案数不够了,所以必须放1,那么dp
[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 [1] + dp [0]) {puts ("-1"); continue;} while (n) { if (dp [0] >= k) { printf ("0"); } else {printf ("1"); k -= dp [0];} n--; } puts (""); } return 0; }
相关文章推荐
- URAL 1081 Binary Lexicographic Sequence (递推 + 递归)
- Ural 1081 Binary Lexicographic Sequence(DP)
- URAL1081——DP—— Binary Lexicographic Sequence
- ural Binary Lexicographic Sequence (dp + dfs)
- Ural 1081 Binary Lexicographic Sequence
- ural 1081 Binary Lexicographic Sequence
- Binary Lexicographic Sequence_简单DP
- Binary Lexicographic Sequence
- Ural1081 (dp)
- ural 1018-Binary Apple Tree【树状DP】
- Ural 1018 binary apple tree(显性树的树dp)
- 递推DP URAL 1119 Metro
- 递推DP URAL 1017 Staircases
- URAL 1018 Binary Apple Tree (树形DP)
- 递推DP URAL 1167 Bicolored Horses
- Binary Apple Tree_ural1018_树状dp
- URAL 1018 Binary Apple Tree(树形dp)
- 递推DP URAL 1586 Threeprime Numbers
- URAL 1018 Binary Apple Tree(树形dp入门题)
- ural Brackets Sequence (dp)