POJ 2663 Tri tilling 题解
以上是题面
看一眼发现是骨牌问题的升级版
还以为很简单,兴冲冲地就去提交了
然后。。。。。。。。。。。
于是又回来看了一眼题面
没有我想的那么复杂
先用的是bottom up,后来换了更好理解的top down
这里是对最后一列的讨论:f (n,1) 表示在第n列有1个空格
有了关系式就可以开始写代码了:
//top down,从后往前
long long int f(long long int n, long long int m){
if(dp[n][m] != 0) return dp[n][m];
if(m == 0) dp[n][m] = f(n-2,0)+2*f(n-1,1);
if(m == 1) dp[n][m] = f(n-2,1)+f(n-1,0);
//递推关系式已经写出来了,直接代入就行了
return dp[n][m];
}
因为有多组数据,所以加一个判断条件:
while(scanf("%lld",&n) && n != -1)//有多组数据 ,结尾是-1
最后把它们简单的组装一下:
#include <iostream>
#include <cstdio>
using namespace std;
long long n, m;
long long dp[31][3];
//top down,从后往前
long long int f(long long int n, long long int m){
if(dp[n][m] != 0) return dp[n][m];
if(m == 0) dp[n][m] = f(n-2,0)+2*f(n-1,1);
if(m == 1) dp[n][m] = f(n-2,1)+f(n-1,0);
//递推关系式已经写出来了,直接代入就行了
return dp[n][m];
}
int mian (){//主函数
dp[0][0] = dp[1][1] = 1;dp[2][0] = 3;//初始化边界条件
while(scanf("%lld",&n) && n != -1)//有多组数据 ,结尾是-1
printf("%d\n",f(n,0));//直接输出
return 0;//好习惯
}