状压dp

POJ3254 corn fields

题意: 有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的(用1标记),农夫可以在这些格子里放牛,其他格子则不能放牛(用0标记),并且要求不可以使相邻格子都有牛。现在输入数据给出这块地的大小及可否放牧的情况,求该农夫有多少种放牧方案可以选择(注意:任何格子都不放也是一种选择)

#include<cstdio>
using namespace std;
const int M=100000000;
int n,m,i,j,k,x,st[4096],f[13][4096],ans,top,cur[13];
int main(){
    scanf("%d%d",&n,&m);
    for (i=0;i<1<<m;i++)
        if (!(i&(i<<1))) st[top++]=i;
    for (i=0;i<n;i++)
        for (j=0;j<m;j++){
            scanf("%d",&x);
            if (!x) cur[i]|=1<<j;
        }
    for (i=0;i<top;i++)
        if (!(st[i]&cur[0])) f[0][i]=1;
    for (i=1;i<n;i++)
        for (j=0;j<top;j++)
            if (!(st[j]&cur[i]))
                for (k=0;k<top;k++)
                    if (!(st[j]&st[k]) && !(st[k]&cur[i-1])) f[i][j]=(f[i][j]+f[i-1][k])%M;
    for (i=0;i<top;i++) ans=(ans+f[n-1][i])%M;
    printf("%d",ans);
}

poj1185炮兵阵地

//https://www.cnblogs.com/buptLizer/archive/2012/08/23/2651881.html
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
char s[13];
int n,m,i,j,k,t,top,cur[102],st[62],cnt[62],f[102][62][62],ans;
int count(int x){
    int sum=0;
    for (;x;x^=x&-x,sum++);
    return sum;
}
int main(){
    while (~scanf("%d%d",&n,&m)){
        for (i=0;i<n;i++){
            scanf("%s",s);
            for (j=0;j<m;j++)
                if (s[j]=='H') cur[i]|=1<<m-j-1;
        }
        top=0;
        for (i=0;i<1<<m;i++)
            if (!(i&(i<<1)) && !(i&(i<<2))) st[top]=i,cnt[top++]=count(i);
        memset(f,-63,sizeof(f));
        for (i=0;i<top;i++)
            if (!(st[i]&cur[0])) f[0][i][0]=cnt[i];
        for (i=1;i<n;i++)
            for (j=0;j<top;j++)
                if (!(st[j]&cur[i]))
                    for (k=0;k<top;k++)
                        if (!(st[k]&cur[i-1]) && !(st[j]&st[k]))
                            for (t=0;t<top;t++)
                                if (!(st[j]&st[t])) f[i][j][k]=max(f[i][j][k],f[i-1][k][t]+cnt[j]);
        ans=0;
        for (i=0;i<top;i++)
            for (j=0;j<top;j++) ans=max(ans,f[n-1][i][j]);
        printf("%d\n",ans);
    }
}

HDU1429 胜利大逃亡

//https://blog.csdn.net/u014355480/article/details/47264503
#include<bits/stdc++.h>
using namespace std;
struct node{
    int x,y,t,st;
};
int vis[22][22][1<<10],n,m,k,i,x,y,b[4][2]={{1,0},{-1,0},{0,-1},{0,1}},j;
queue<node>q;
char mp[22][22];
int bfs(int x,int y){
    memset(vis,0,sizeof(vis));
    while (!q.empty()) q.pop();//这句话不能删 
    q.push((node){x,y,0,0});
    vis[x][y][0]=1;
    while (!q.empty()){
        node u=q.front(),v;q.pop();
        if (u.t>=k-1) break;
        v.t=u.t+1;
        for (int i=0;i<4;i++){
            v.x=u.x+b[i][0];v.y=u.y+b[i][1];
            v.st=u.st;
            if (0<=v.x && v.x<n && 0<=v.y && v.y<m && mp[v.x][v.y]!='*' && !vis[v.x][v.y][v.st]){
                if (isupper(mp[v.x][v.y]) && !(v.st&(1<<mp[v.x][v.y]-'A'))) continue;
                if (mp[v.x][v.y]=='^') return v.t;
                if (islower(mp[v.x][v.y])) v.st|=1<<mp[v.x][v.y]-'a';
                if (!vis[v.x][v.y][v.st]){
                    vis[v.x][v.y][v.st]=1;
                    q.push((node){v.x,v.y,v.t,v.st});
                }
            }
        }
    }
    return -1;
}
int main(){
    while (~scanf("%d%d%d",&n,&m,&k)){
        for (i=0;i<n;i++){
            scanf("%s",mp[i]);
            for (j=0;j<m;j++)
                if (mp[i][j]=='@') x=i,y=j;
        }
        printf("%d\n",bfs(x,y));
    }
}

HDU 4539 郑厂长系列故事――排兵布阵

//https://blog.csdn.net/Flynn_curry/article/details/51146443
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=203;
char s[13];
int n,m,i,j,k,t,top,cur[102],st[N],cnt[N],f[102][N][N],ans,x;
int count(int x){
    int sum=0;
    for (;x;x^=x&-x,sum++);
    return sum;
}
int main(){
    while (~scanf("%d%d",&n,&m)){
        for (i=0;i<n;i++){
            cur[i]=0;
            for (j=0;j<m;j++){
                scanf("%d",&x);
                if (!x) cur[i]|=1<<j;
            }
        }
        top=0;
        for (i=0;i<1<<m;i++)
            if (!(i&(i<<2)) && !(i&(i>>2))) st[top]=i,cnt[top++]=count(i);
        memset(f,-63,sizeof(f));
        for (i=0;i<top;i++)
            if (!(st[i]&cur[0])) f[0][i][0]=cnt[i];
        for (i=1;i<n;i++)
            for (j=0;j<top;j++)
                if (!(st[j]&cur[i]))
                    for (k=0;k<top;k++)
                        if (!(st[k]&cur[i-1]) && !(st[j]&(st[k]<<1)) && !((st[j]<<1)&st[k]))
                            for (t=0;t<top;t++)
                                if (!(st[j]&st[t]) && !(st[k]&(st[t]<<1)) && !((st[k]<<1)&(st[t])))
                                f[i][j][k]=max(f[i][j][k],f[i-1][k][t]+cnt[j]);
        ans=0;
        for (j=0;j<top;j++)
            for (k=0;k<top;k++) ans=max(ans,f[n-1][j][k]);
        printf("%d\n",ans);
    }
}

HDu3001 Travelling

//https://blog.csdn.net/u010372095/article/details/38474721
#include<bits/stdc++.h>
using namespace std;
int in[12],n,m,i,ans,j,k,th[12],dp[12][60002],mp[12][12],x,y,z,to,go;
int calc(int x){
    int k=0;
    for (int i=0;i<n;i++) th[i]=x%3,x/=3,k+=(th[i]>0);
    return k;
}
int main(){
    in[0]=1;
    for (i=1;i<=10;i++) in[i]=in[i-1]*3;
    while (~scanf("%d%d",&n,&m)){
        for (i=0;i<n;i++){
            for (j=0;j<in[n];j++) dp[i][j]=1e9;
            for (j=0;j<n;j++) mp[i][j]=1e9;
        }
        for (i=0;i<m;i++) scanf("%d%d%d",&x,&y,&z),x--,y--,mp[x][y]=mp[y][x]=min(mp[x][y],z);
        ans=1e9;
        for (go=1;go<in[n];go++){
            k=calc(go);
            for (i=0;i<n;i++)
                if (th[i]){
                    if (k==1) dp[i][go]=0;
                    if (dp[i][go]>1e8) continue;
                    if (k==n) ans=min(ans,dp[i][go]);
                    for (j=0;j<n;j++)
                        if (th[j]<2 && i!=j){
                            to=go+in[j];
                            dp[j][to]=min(dp[j][to],dp[i][go]+mp[i][j]);
                        }
                }
        }
        printf("%d\n",ans>1e8?-1:ans);
    }
}

HDU4778 13杭州I题

//https://blog.csdn.net/cacyth/article/details/49105567
#include<bits/stdc++.h>
using namespace std;
int dp[1<<22],g,b,s,i,y,x[22][11],now[11],n,j;
int dfs(int p){
    if (dp[p]!=-1) return dp[p];
    int tmp[10];
    for (int i=1;i<=g;i++) tmp[i]=now[i];
    int ss=-1e9;
    for (int i=0;i<b;i++)
        if (!(p&(1<<i))){
            int cnt=0;
            for (int j=1;j<=g;j++){
                now[j]+=x[i][j];
                cnt+=now[j]/s;
                now[j]%=s;
            }
            ss=max(ss,cnt+(cnt>0?1:-1)*dfs(p|(1<<i)));
            for (int j=1;j<=g;j++) now[j]=tmp[j];
        }
    return dp[p]=ss;
}
int main(){
    while (~scanf("%d%d%d",&g,&b,&s)){
        if (!g && !b && !s) return 0;
        for (i=0;i<b;i++){
            scanf("%d",&n);
            memset(x[i],0,sizeof(x[i]));
            for (j=1;j<=n;j++) scanf("%d",&y),x[i][y]++;
        }
        memset(dp,-1,sizeof(dp));
        dp[(1<<b)-1]=0;
        printf("%d\n",dfs(0));
    }
}

POJ 2836 Rectangular Covering

//https://blog.csdn.net/albertluf/article/details/80338378
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
int n,i,tot,s[230],st[230],f[1<<15],x[16],y[16],j,k;
int main(){
    while (~scanf("%d",&n)){
        if (!n) return 0;
        for (i=0;i<n;i++) scanf("%d%d",&x[i],&y[i]);
        tot=0;
        for (i=0;i<n;i++)
            for (j=i+1;j<n;j++){
                s[tot]=max(1,abs(x[i]-x[j]))*max(1,abs(y[i]-y[j]));
                st[tot]=0;
                for (k=0;k<n;k++)
                    if ((x[i]-x[k])*(x[j]-x[k])<=0 && (y[i]-y[k])*(y[j]-y[k])<=0) st[tot]|=1<<k;
                tot++;
            }
        memset(f,63,sizeof(f));
        f[0]=0;
        for (i=0;i<1<<n;i++)
            for (j=0;j<tot;j++) f[i|st[j]]=min(f[i|st[j]],f[i]+s[j]);
        printf("%d\n",f[(1<<n)-1]);
    }
}

POJ 1795 DNA Laboratory

//https://www.cnblogs.com/dwtfukgv/p/7076379.html
#include<cstring>
#include<cstdio>
#include<vector>
#include<iostream>
#include<algorithm>
using namespace std;
string s[22],ans;
int T,n,i,dis[22][22],f[1<<16][16],Case,j,ok,m,k,id;
vector<string>v;
void init(){
    for (int i=0;i<n;i++)
        for (int j=0;j<n;j++)
            if (i!=j){
                int t=min(v[i].size(),v[j].size());
                dis[i][j]=0;
                for (int k=t;k>=0;k--)
                    if (v[i].substr(v[i].size()-k)==v[j].substr(0,k)){
                        dis[i][j]=v[i].size()-k;
                        break;
                    }
            }
}
void dfs(int id,int s){
    if (!s) return;
    string ss="Z";
    int x;
    for (int i=0;i<n;i++)
        if (s&(1<<i) && f[s|(1<<id)][id]==f[s][i]+dis[id][i]){
            string sss=v[i].substr(v[id].size()-dis[id][i]);
            if (ss>sss) ss=sss,x=i;
        }
    ans+=ss;
    dfs(x,s^(1<<x));
}
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d",&n);
        printf("Scenario #%d:\n",++Case);
        for (i=0;i<n;i++) cin>>s[i];
        v.clear();
        for (i=0;i<n;i++){
            ok=1;
            for (j=0;j<n;j++)
                if (s[j].size()>=s[i].size() && i!=j && s[j].find(s[i])!=string::npos){
                    ok=0;
                    break;
                }
            if (ok) v.push_back(s[i]);
        }
        if (v.empty()){
            cout<<s[0]<<endl<<endl;
            continue;
        }
        sort(v.begin(),v.end());
        n=v.size();
        init();
        memset(f,63,sizeof(f));
        for (i=0;i<n;i++) f[1<<i][i]=v[i].size();
        m=(1<<n)-1;
        for (i=0;i<1<<n;i++)
            for (j=0;j<n;j++)
                if (f[i][j]<1e9)
                    for (k=0;k<n;k++)
                        if (!(i&(1<<k))) f[i|(1<<k)][k]=min(f[i|(1<<k)][k],f[i][j]+dis[k][j]);
        id=0;
        for (i=1;i<n;i++)
            if (f[m][i]<f[m][id]) id=i;
        ans=v[id];
        dfs(id,m^(1<<id));
        cout<<ans<<endl<<endl;
    }
}

POJ 3411 Paid Roads

//https://blog.csdn.net/lyy289065406/article/details/6689310
#include<cstdio>
#include<cstring>
using namespace std;
struct node{
    int a,b,c,p,r;
}a[12];
int n,m,i,mn,vis[12];
void dfs(int u,int fee){
    if (u==n && fee<mn){
        mn=fee;
        return;
    }
    for (int i=0;i<m;i++)
        if (u==a[i].a && vis[a[i].b]<=3){
            vis[a[i].b]++;
            dfs(a[i].b,fee+(vis[a[i].c]?a[i].p:a[i].r));
            vis[a[i].b]--;
        }
}
int main(){
    while (~scanf("%d%d",&n,&m)){
        memset(vis,0,sizeof(vis));
        vis[1]=1;
        for (i=0;i<m;i++) scanf("%d%d%d%d%d",&a[i].a,&a[i].b,&a[i].c,&a[i].p,&a[i].r);
        mn=1e9;
        dfs(1,0);
        if (mn<1e9) printf("%d\n",mn);
        else printf("impossible\n");
    }
}

POJ 2430 lazy cow

/*https://blog.csdn.net/cmonkey_cfj/article/details/7272893
题解有点小错误 
f[i][j][0] 前i只牛,放到j个barn中,双行 (一起的) 
f[i][j][1] 前i只牛,放到j个barn中, 上行 
f[i][j][2] 前i只牛,放到j个barn中, 下行 
f[i][j][3] 前i只牛,放到j个barn中, 上下行(分开的) 
*/
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct kk{
    int x,y;
}a[1002];
int n,K,m,i,j,k,t,f[1002][1002][4];
bool cmp(kk x,kk y){
    return x.x<y.x;
}
int min4(int a,int b,int c,int d){
    if (b<a) a=b;
    if (c<a) a=c;
    if (d<a) a=d;
    return a;
}
int main(){
    while (~scanf("%d%d%d",&n,&K,&m)){
        for (i=1;i<=n;i++) scanf("%d%d",&a[i].y,&a[i].x);
        sort(a+1,a+n+1,cmp);
        memset(f,63,sizeof(f));
        a[0].x=0;
        f[1][1][0]=f[1][2][3]=2;
        if (n>=2 && a[1].x==a[2].x) f[2][1][0]=f[2][2][3]=2;
        else f[1][1][a[1].y]=1;
        for (k=1;k<=K;k++)
            for (i=1;i<=n;i++){
                if (k<2) j=1e9;
                else j=min4(f[i-1][k-2][0],f[i-1][k-2][1],f[i-1][k-2][2],f[i-1][k-2][3]);
                t=min4(f[i-1][k-1][0],f[i-1][k-1][1],f[i-1][k-1][2],f[i-1][k-1][3]);
                f[i][k][0]=min(f[i][k][0],min(f[i-1][k][0]+2*(a[i].x-a[i-1].x),t+2));
                f[i][k][3]=min(f[i][k][3],min4(j+2,
                f[i-1][k][3]+2*(a[i].x-a[i-1].x),
                f[i-1][k-1][1]+a[i].x-a[i-1].x+1,
                f[i-1][k-1][2]+a[i].x-a[i-1].x+1));
                if (i<n && a[i].x==a[i+1].x){
                    f[i+1][k][0]=f[i][k][0];
                    f[i+1][k][3]=f[i][k][3];
                    i++;
                }else{
                    f[i][k][a[i].y]=min4(t+1,
                    f[i-1][k][a[i].y]+a[i].x-a[i-1].x,
                    f[i-1][k][3]+a[i].x-a[i-1].x,
                    f[i][k][a[i].y]);
                }
            }
        printf("%d\n",min4(f[n][K][0],f[n][K][1],f[n][K][2],f[n][K][2]));
    }
}

POJ 3311 Hie with the Pie

//https://blog.csdn.net/chinaczy/article/details/5890768
//TSP问题
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,i,j,k,f[1<<12][12],a[12][12],ans,s;
int main(){
    while (1){
        scanf("%d",&n);
        if (!n) return 0;
        for (i=0;i<=n;i++)
            for (j=0;j<=n;j++) scanf("%d",&a[i][j]);
        for (k=0;k<=n;k++)
            for (i=0;i<=n;i++)
                for (j=0;j<=n;j++) a[i][j]=min(a[i][j],a[i][k]+a[k][j]);
        memset(f,63,sizeof(f));
        for (s=0;s<1<<n;s++)
            for (i=1;i<=n;i++)
                if (s&(1<<i-1)){
                    if (s==(1<<i-1)) f[s][i]=a[0][i];
                    else for (j=1;j<=n;j++)
                            if (i!=j && s&(1<<j-1)) f[s][i]=min(f[s][i],f[s^(1<<i-1)][j]+a[j][i]);
                }
        ans=1e9;
        for (i=1;i<=n;i++) ans=min(ans,f[(1<<n)-1][i]+a[i][0]);
        printf("%d\n",ans);
    }
}

POJ2288 islands and bridges

//https://www.cnblogs.com/jackge/archive/2013/05/24/3096162.html
//dp[state][i][j]表示state状态下倒数第二个岛为i,最后一个岛为j时的最优解
//num[state][i][j]为相应的路径数目
#include<cstdio>
#include<cstring>
using namespace std;
typedef long long ll;
int ans1,T,i,j,k,x,y,tmp,f[1<<13][13][13],n,m,v[13],mp[13][13];
ll num[1<<13][13][13],ans2;
int main(){
    scanf("%d",&T);
    while (T--){
        scanf("%d%d",&n,&m);
        for (i=0;i<n;i++) scanf("%d",&v[i]);
        if (n==1){
            printf("%d 1\n",v[0]);
            continue;
        }
        memset(mp,0,sizeof(mp));
        for (i=0;i<m;i++){
            scanf("%d%d",&x,&y);
            x--;y--;
            mp[x][y]=mp[y][x]=1;
        }
        memset(f,-1,sizeof(f));
        for (i=0;i<n;i++)
            for (j=0;j<n;j++)
                if (i!=j && mp[i][j]) f[(1<<i)|(1<<j)][i][j]=v[i]+v[j]+v[i]*v[j],num[(1<<i)|(1<<j)][i][j]=1;
        for (i=0;i<1<<n;i++)
            for (j=0;j<n;j++)
                if (i&(1<<j))
                    for (k=0;k<n;k++)
                        if (k!=j && i&(1<<k) && mp[j][k] && f[i][j][k]!=-1)
                            for (x=0;x<n;x++)
                                if (x!=j && x!=k && mp[k][x] && !(i&(1<<x))){
                                    tmp=f[i][j][k]+v[x]+v[k]*v[x];
                                    if (mp[j][x]) tmp+=v[j]*v[k]*v[x];
                                    if (tmp>f[i|(1<<x)][k][x]) f[i|(1<<x)][k][x]=tmp,num[i|(1<<x)][k][x]=num[i][j][k];
                                    else if (tmp==f[i|(1<<x)][k][x]) num[i|(1<<x)][k][x]+=num[i][j][k];
                                }
        ans1=ans2=0;
        for (i=0;i<n;i++)
            for (j=0;j<n;j++)
                if (f[(1<<n)-1][i][j]>ans1) ans1=f[(1<<n)-1][i][j],ans2=num[(1<<n)-1][i][j];
                else if (f[(1<<n)-1][i][j]==ans1) ans2+=num[(1<<n)-1][i][j];
        printf("%d %lld\n",ans1,ans2/2);
    }
}

POJ1038

//https://blog.csdn.net/chai_jing/article/details/68063587
//重要点一:0表示上下ok,1表示上被占下未被占,2表示下被占
//二:下面那格被占,那上面那格也不能放矩形了 
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define p(i) (p/pow[i]%3)
#define q(i) (q/pow[i]%3)
int i,j,ans,p,q,T,n,m,k,x,y,pow[13],ok[202][12],f[2][100003],now;
void dfs(int x,int y,int tot){
    if (y>m) return;
    if (y<m && !p(y) && !p(y+1) && !q(y) && !q(y+1)){
        q+=(pow[y]+pow[y+1])*2;
        f[now^1][q]=max(f[now^1][q],tot+1);
        dfs(x,y+2,tot+1);
        q-=(pow[y]+pow[y+1])*2;
    }
    if (y<m-1 && !q(y) && !q(y+1) && !q(y+2)){
        q+=(pow[y]+pow[y+1]+pow[y+2])*2;
        f[now^1][q]=max(f[now^1][q],tot+1);
        dfs(x,y+3,tot+1);
        q-=(pow[y]+pow[y+1]+pow[y+2])*2;
    }
    dfs(x,y+1,tot);
}
int main(){
    scanf("%d",&T);
    pow[1]=1;//注意不是0,是1 
    for (i=2;i<12;i++) pow[i]=pow[i-1]*3;
    while (T--){
        scanf("%d%d%d",&n,&m,&k);
        memset(ok,0,sizeof(ok));
        memset(f,-1,sizeof(f));
        while (k--){
            scanf("%d%d",&x,&y);
            ok[x][y]=1;
        }
        p=0;
        for (i=1;i<=m;i++) p+=(ok[1][i]+1)*pow[i];
        f[0][p]=0;now=0;
        for (i=2;i<=n;i++,now^=1){
            memset(f[now^1],-1,sizeof(f[now^1]));
            for (p=0;p<pow[m+1];p++)
                if (f[now][p]!=-1){
                    q=0;
                    for (j=1;j<=m;j++)
                        if (ok[i][j]) q+=pow[j]*2;
                        else q+=pow[j]*max(0,p(j)-1);
                    f[now^1][q]=max(f[now^1][q],f[now][p]);
                    dfs(i,1,f[now][p]);
                }
        }
        ans=0;
        for (i=0;i<pow[m+1];i++) ans=max(ans,f[now][i]);
        printf("%d\n",ans);
    }
}

ZOJ 1346 Comparing Your Heroes

//https://blog.csdn.net/yuanxinyu402/article/details/50935668
#include<bits/stdc++.h>
using namespace std;
struct node{
    int to,ne;
}e[35];
int tot,n,h[17],i,j,in[17],cnt,dp[1<<17],m;
map<string,int>mp;
string s1,s2;
int id(string s){
    return mp[s]?mp[s]:mp[s]=++n;
}
void add(int x,int y){
    e[++tot]=(node){y,h[x]};
    h[x]=tot;
}
void check(int S){
    memset(in,0,sizeof(in));
    for (int u=0;u<n;u++)
        if (!(S&(1<<u)))
            for (int i=h[u],v;i;i=e[i].ne)
                if (!(S&(1<<(v=e[i].to)))) in[v]++;
}
int main(){
    while (~scanf("%d",&m)){
        mp.clear();tot=n=0;
        memset(h,0,sizeof(h));
        while (m--){
            cin>>s1>>s2;
            add(id(s1)-1,id(s2)-1);
        }
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for (i=0;i<1<<n;i++){
            check(i);
            for (j=0;j<n;j++)
                if (!(i&(1<<j)) && !in[j])//所有比j大的都在集合S中 
                dp[i|(1<<j)]+=dp[i]; 
        }
        printf("%d\n",dp[(1<<n)-1]);
    }
}

ZOJ3471 Most Powerful

//https://blog.csdn.net/jianing1996/article/details/8939102
#include<bits/stdc++.h>
using namespace std;
int n,i,j,s,ans,dp[1<<11],a[11][11];
int main(){
    while (1){
        scanf("%d",&n);
        if (!n) return 0;
        for (i=0;i<n;i++)
            for (j=0;j<n;j++) scanf("%d",&a[i][j]);
        memset(dp,0,sizeof(dp));
        for (s=0;s<1<<n;s++)
            for (i=0;i<n;i++)
                if (!(s&(1<<i)))
                    for (j=0;j<n;j++)
                        if (i!=j && !(s&(1<<j))) dp[s|(1<<j)]=max(dp[s|(1<<j)],dp[s]+a[i][j]);
        ans=0;
        for (i=0;i<1<<n;i++) ans=max(ans,dp[i]);
        printf("%d\n",ans);
    }
}

POJ2411 Mondriaan’s Dream

题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值