uva11069

来源:互联网 发布:货到付款淘宝网商城 编辑:程序博客网 时间:2024/04/30 23:52

找一个1-n的子集,满足两个条件

(1)任何数不能相差1

(2)向其中插入不存在其中的1-n的数一定会存在一个数和其相差1.

用递归来统计。

f[i]表明选用了1-i个数中最后一个数。

那么f[i] = f[i - 3] + f[i - 2],因为选了i一定就要么选i - 2,要么选i - 3

最终答案是f[n] + f[n - 1]


AC代码:

#include <cstdio>#include <string.h>const int MAX_NUMBER = 100;long long value[MAX_NUMBER];int vis[MAX_NUMBER];void search(int cnt_number) {    if (vis[cnt_number]) {        return ;    }    vis[cnt_number] = 1;    value[cnt_number] = 0;    if (cnt_number > 2) {        search(cnt_number - 2);        value[cnt_number] += value[cnt_number - 2];    }    if (cnt_number > 3) {        search(cnt_number - 3);        value[cnt_number] += value[cnt_number - 3];    }}int main() {    memset(vis, 0, sizeof(vis));    value[1] = 1;    vis[1] = 1;    value[2] = 1;    vis[2] = 1;    int n;     while (scanf("%d", &n) != EOF) {        search(n);        search(n - 1);        long long ans = value[n] + value[n - 1];        printf("%lld\n", ans);    }    return 0;}


原创粉丝点击