[POJ 2411]Mondriaan's Dream:状压DP

来源:互联网 发布:json串转json对象 编辑:程序博客网 时间:2024/05/17 06:57

点击这里查看原题

以往的做法是按行进行转移,需要预处理出各种状态间的转移。一种更快的做法是按格点进行转移,状态表示的是每个已被处理过的格点的下一行的状态。具体可以参考http://blog.csdn.net/sf____/article/details/15026397
这里写图片描述

/*User:SmallLanguage:C++Problem No.:2411*///#include<bits/stdc++.h>//POJ使用这个头文件会CE #include<stdio.h>#include<iostream>#include<iomanip>#include<string.h>#define ll long long#define inf 999999999using namespace std;int n,m,p,q;ll f[3][(1<<11)+5];void solve(){    memset(f,0,sizeof(f));     p=0,q=1;    f[q][0]=1;    int t=(1<<m);    for(int i=0;i<n;i++){        for(int j=0;j<m;j++){            swap(p,q);            memset(f[q],0,sizeof(f[q]));//滚动数组            for(int s=0;s<t;s++){                if(!f[p][s]) continue;                f[q][s^(1<<j)]+=f[p][s];//纵向,若第j位不能放,则下一行可以放;若可以放,则下一行不能放                 if(j&&(s&(1<<(j-1)))&&!(s&(1<<j)))//横向,把上一位的纵向摆放旋转过来变成横向                     f[q][s^(1<<(j-1))]+=f[p][s];            }        }    }     cout<<f[q][0]<<endl;}int main(){    freopen("data.in","r",stdin);//    ios::sync_with_stdio(false);    while(cin>>n>>m&&n+m) solve();    return 0;}
0 0
原创粉丝点击