[HDU 1565]方格取数(1):状压DP

来源:互联网 发布:淘宝内衣代理 编辑:程序博客网 时间:2024/05/19 19:14

点击这里查看原题

格点转移

/*User:SmallLanguage:C++Problem No.:1565*/#include<bits/stdc++.h>#define ll long long#define inf 999999999using namespace std;int n,p,q,a[20][20];ll f[2][1<<20],ans;void solve(){    p=0,q=1;    ans=0;    int t=1<<n;    memset(f,0,sizeof(f));    for(int i=0;i<n;i++)        for(int j=0;j<n;j++) cin>>a[i][j];    for(int i=0;i<n;i++){        for(int j=0;j<n;j++){            swap(p,q);            memset(f[q],0,sizeof(f[q]));            for(int s=0;s<t;s++){                //不取                f[q][(s|(1<<j))^(1<<j)]=max(f[q][(s|(1<<j))^(1<<j)],f[p][s]);                //取需要两个条件:上一个位置没取(即上一位置的下一行可以取),这个位置可以取                 if((j==0||(j&&(s>>(j-1)&1)==0))&&(s>>j&1)==0)                    f[q][s|(1<<j)]=max(f[q][s|(1<<j)],f[p][s]+a[i][j]);            }        }    }    for(int s=0;s<t;s++) ans=max(ans,f[q][s]);    cout<<ans<<endl;}int main(){    freopen("data.in","r",stdin);//    ios::sync_with_stdio(false);    while(cin>>n) solve();     return 0;}
0 0
原创粉丝点击