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]); }