Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstring>
- using namespace std;
- typedef long long ll;
- int H;
- int K;
- int dp[2][51][51][51];
- int dp2[51];
- const ll MOD=1000000007;
- #define ADDMOD(a,b) ((a)+((ll)(b)))%MOD
- #define MULMOD(a,b) ((a)*((ll)(b)))%MOD
- int solve(int h,int l,int r,int skip_phase)
- {
- if(h==H) return skip_phase;
- if(dp[skip_phase][h][l][r]==-1)
- {
- dp[skip_phase][h][l][r]=0;
- if(l>r) return dp[skip_phase][h][l][r]=skip_phase;
- if(skip_phase)
- {
- dp[skip_phase][h][l][r]=1;
- for(int i=l+1;i<=r;i++)
- {
- dp[skip_phase][h][l][r]=ADDMOD(dp[skip_phase][h][l][r],solve(h,i,r,0));
- }
- }
- else
- {
- for(int i=1;l+i-1<=r;i++)
- {
- dp[skip_phase][h][l][r]=ADDMOD(dp[skip_phase][h][l][r],
- MULMOD(
- MULMOD(
- ADDMOD(solve(h+1,l,l+i-1,0),solve(h+1,l,l+i-1,1))
- ,solve(h,l+i,r,1))
- ,dp2[i])
- );
- }
- }
- }
- return dp[skip_phase][h][l][r];
- }
- struct BricksN
- {
- int countStructures(int w, int h, int k)
- {
- dp2[0]=1;
- dp2[1]=1;
- for(int i=2;i<=w;i++)
- {
- for(int j=1;j<=k;j++)
- {
- dp2[i]=ADDMOD(dp2[i],dp2[i-j]);
- }
- }
- memset(dp,-1,sizeof(dp));
- H=h;
- K=k;
- return ADDMOD(solve(0,0,w-1,0),solve(0,0,w-1,1));
- }
- }ccc;
- int main()
- {
- cout<<ccc.countStructures(50,1,50)<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment