hdu 2045

不容易系列之(3)—— LELE的RPG难题

http://acm.hdu.edu.cn/showproblem.php?pid=2045
解法一:做题思路:正难则反
如果不考虑“首尾两格也不同色”这个条件,则全部的涂法为(先考虑第一块只涂其中一种色的情况) sum1=pow(2,n-1);
假设首尾两格同色,则全部的涂法为(当n>=3)(先考虑第一块只涂其中一种色的情况)
record[n]=record[n-2]*2+pow(2,n-2)-record[n-2]*2-record[n-1];
则总涂法为(第一块只涂其中一种色的总数3):sum=3(sum1-record[n]);

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

long long record[55];

int main()
{
    int N;
    while(cin>>N)
    {
        memset(record,0,sizeof(record));
        record[1]=0;
        record[2]=0;
        if(N>=3)
            for(int i=3;i<=N;i++)
            {
                long long x=pow(2,i-2);
                record[i]=record[i-2]*2+x-record[i-2]*2-record[i-1];
            }
        long long sum=3*(pow(2,N-1)-record[N]);
        printf("%lld\n",sum);
    }
    return 0;
}

解法二:递推思想
(当n>=4时)
当第n-1个格子与第一个格子颜色不同时的总方案数为record[n-1];
当第n-1个格子与第一个格子颜色相同时的总方案数为record[n-2];(第(n-2)个格子与第(n-1)个格子颜色一定不同)
当第n-1个格子与第一个格子颜色不同时,第n个格子只有一种选择,这种情况下,总方案数为sum1=record[n-1];
当第n-1个格子与第一个格子颜色相同时,第n个格子可以有两种选择,这种情况下总方案数为sum2=2*record[n-2];
总方案数record[n]=sum1+sum2;

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;

long long record[55];

int main()
{
    record[1]=3;
    record[2]=6;
    record[3]=6;//前三种情况时特例
    for(int i=4;i<=50;i++)
        record[i]=record[i-1]+2*record[i-2];
    int N;
    while(cin>>N)
        printf("%lld\n",record[N]);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/violet_ljp/article/details/80284128
今日推荐