(状态压缩dp+GOOD) acwing 291. 蒙德里安的梦想

291. 蒙德里安的梦想

题目链接https://www.acwing.com/problem/content/293/
题目:
(状态压缩dp+GOOD) acwing 291. 蒙德里安的梦想_第1张图片
(状态压缩dp+GOOD) acwing 291. 蒙德里安的梦想_第2张图片

#include
#include
#include
#include
#include
using namespace std;
long long  f[12][1<<12];
vector<int >a[1<<12];
bool sta[1<<11];
int main(){
    int n,m;
    while(cin>>n>>m,n||m){
        memset(sta,0,sizeof sta);

        for(int i=0;i<1<<n;i++){
            int ct=0;
            sta[i]=1;
            for(int j=0;j<n;j++){
                if(i>>j&1){
                    if(ct&1){
                        sta[i]=0;
                        break;
                    }
                    ct=0;
                }else ct++;
            }
            if(ct&1) sta[i]=0;
        }

        for(int i=0;i<1<<n;i++){
            a[i].clear();
            for(int j=0;j<1<<n;j++){
                if((i&j)==0&&sta[i|j]){
                    a[i].push_back(j);
                }
            }
        }
        memset(f,0,sizeof f);
        f[0][0]=1;
        for(int i=1;i<=m;i++){
            for(int j=0;j<1<<n;j++){
                for(auto t:a[j]){
                    f[i][j]+=f[i-1][t];
                }
            }
        }
        cout<<f[m][0]<<endl;
    }
    return 0;
}


你可能感兴趣的:(AcWing,动态规划,算法)