Uva 11069 - A Graph Problem 递推

来源:互联网 发布:淘宝客合作 编辑:程序博客网 时间:2024/05/17 03:48

题意:有n个数,问满足下列两个条件时可以分成几个子集

1.子集中两个元素的差s要2<=s<=3

2.子集尽可能的长,如1 3 5,不能1 5,因为3还可以插到1 5中间

思路:用dp[i]表示用前i个数能形成的子集,对于dp[i]来说,决定它的是dp[i-2]或者dp[i-3],有第i个元素的子集必定有第i-2个或者第i-3个元素的子集

代码:

#include <iostream>#include <stdio.h>#include <cmath>#include <cstring>#include <map>#include <vector>#include <queue>#include <algorithm>const int M=100;using namespace std;long long dp[M];void init(){    dp[0]=dp[1]=1;    dp[2]=2;    for(int i=3;i<=M;i++)    dp[i]=dp[i-2]+dp[i-3];}int main(){    int n;    init();    while(scanf("%d",&n)==1)    {        printf("%lld\n",dp[n]);    }    return 0;}