P2622 关灯问题II

_____________________________________________________________________________________________

逆向DP搞一搞就行

其实感觉本题更适合bfs好一点,没有dp的必要

#include<bits/stdc++.h>
using namespace std;
int n,m,a[150][20],f[5000];
int now(int val,int lne)
{
    int no=val;
    for(int i=1;i<=n;i++)
    {
        if(!a[lne][i])continue;
        if((a[lne][i]==1)&&(val&(1<<(i-1))))no^=(1<<(i-1));
        if((a[lne][i]==-1)&&(!(val&(1<<(i-1)))))no^=(1<<(i-1));
    }
    return no;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)for(int j=1;j<=n;j++)cin>>a[i][j];
    memset(f,0x3f,sizeof(f));
    f[(1<<n)-1]=0;
    for(int i=(1<<n)-1;i>=0;i--)
    for(int j=1;j<=m;j++)
    f[now(i,j)]=min(f[now(i,j)],f[i]+1);
    cout<<(f[0]==1061109567?-1:f[0]);
 } 
原文地址:https://www.cnblogs.com/SFWR-YOU/p/11279190.html