HDU1143——Tri Tiling(DP)
阿新 • • 發佈:2018-12-18
思路:把大矩形用豎線切出左邊一部分,然後遞迴求解,豎線是沿著紋路分的,右面就是f(n-2)有三種情況,即3*f(n-2)。左面是f(n-4),只有兩種情況(注意左面再分是,是不可以出現一條豎線可以切分的情況,所以只有兩種情況)。
遞推公式出現:f(n)=3*f(n-2)+2*f(n-4)+…+2*f(0)
f(n-2)=3*f(n-4)+2*f(n-6)+...+2*f(0),f(n)-f(n-2)得出f(n)公式
f(n)=4*f(n-2)-f(n-4)
#include <iostream> #include <stdio.h> using namespace std; /*long long fun(int n) //用遞迴會出現Memory Limit Exceeded錯誤 //超出記憶體限制 { if(n==0) return 1; if(n==2) return 3; else return 4*fun(n-2)-fun(n-4); }*/ int main() { int n; int a[100]; while(~scanf("%d",&n)) { if(n==-1) break; a[0]=1; a[2]=3; for(int i=3;i<=n;i++) a[i] = 4*a[i-2]-a[i-4]; if(n%2!=0) printf("0\n"); else printf("%d\n",a[n]); } return 0; }