2236 - 方砖问题
用边长小于N的正方形方砖(注意,不要求所有的方砖大小相同,请看样例说明)不重叠地铺满N*N的正方形房间,最少要几块方砖。
Input
第一行是一个整数T,表示测试数据的组数,接下来的T 行,每一行是一个N(2<=N<=100)
Output
对于每一组测试数据输出一行,为最少需要的块数。
Examples
Input
2 4 5
Output
4 8
Hint
当N=4时
最优的铺砖方法
AABB
AABB
CCDD
CCDD
A,B,C,D为四块方砖的代号。
其他的铺砖方法,例如:
AAAB
AAAC
AAAD
EFGH
需要的8块方砖,不是最少的。
Solution C++
#include<cstdio> #include<iostream> #include<algorithm> #include<cstring> #define infinity 0x3f3f3f3f using namespace std; int a[104][105]; int slove(int n) { int i,j,k,t,mins; memset(a,0,sizeof(a)); for(i=1;i<=n;i++) { for(j=1;j<=n;j++) { if(i==j&&i!=n) { a[i][j]=1; } else { mins=infinity; if(i<j) { for(k=j/2;k<=j-1;k++) { mins=min(mins,a[k][i]+a[j-k][i]); } } else { for(k=i/2;k<=i-1;k++) { mins=min(mins,a[k][j]+a[i-k][j]); } } a[j][i]=a[j][i]=mins; } } } return a[n][n]; } int main() { int t,n; cin>>t; t--; cin>>n; cout<<slove(n)<<" "<<endl; while(t--) { cin>>n; cout<<slove(n)<<endl; } }
Hint
当N=4时
最优的铺砖方法
AABB
AABB
CCDD
CCDD
A,B,C,D为四块方砖的代号。
其他的铺砖方法,例如:
AAAB
AAAC
AAAD
EFGH
需要的8块方砖,不是最少的。