POJ-2663 Tri Tiling
题目链接:POJ-2663
题目大意:用若干21的方块拼成3n的方格 问有多少种分法
解题思路:自己解决的方法是找规律 借助了Excel这神奇的东西 首先单数肯定不能拼成功 所有输入单数的一律输出0 因为是3n 所以我觉得后面的n一定以前面的n为根本
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
当n=2的时候 一共有三种方法 这三种也构成了后面的基底 n=2时 sum=3
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
当n=4的时候 很简单 就将上面的基底在拼上一个基地就行 一共3乘3等于9种(优快云为什莫不能显示号)
但是我们发现 当一号基底与自己拼搭、二号基底和自己拼搭时 (也就是图中的第三列第一二行的示例)他们可以发生转换形成新结果 效果如下图 n=4时 sum=9+2=11
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
当n=6的时候 同样将上面的元素与基底进行拼搭 这里要注意了 上面的新产生的形式与基底搭配时基底在左和基底在右是两种不同的情况 所以如下图所示
最后和n=4的时候的情况一样 也在边界处发生了旋转形成新结果 如下图所示
所以当n=6的时候 sum = 3乘9 + 1乘3乘2乘2 + 2 = 41
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
最后整理一下
- n = 2 时sum = 3
- n = 4 时sum = 11
- n = 6 时sum = 41
- n = 8 时sum = 153
此时已经可以找到规律了
an = 4*(an-2) - (an-4);
方程出来了 代码就好写了
代码块:
#include<iostream>
using namespace std;
int main(){
int n;
int arr[31];
arr[2] = 3;
arr[4] = 11;
while(cin>>n){
if(n == -1) break;
if(n == 0){
cout<<"1"<<endl;
continue;
}
if(n%2 == 1){
cout<<"0"<<endl;
continue;
}
for(int i=6;i<=n;i+=2){
arr[i] = 4 * arr[i-2] - arr[i - 4];
}
cout<<arr[n]<<endl;
}
return 0;
}
最后还有问题 为什莫会出现这样的式子?(待解)可以动态规划做(待解)