1. 程式人生 > >狀壓DP入門NO.1洛谷 P1879玉米地

狀壓DP入門NO.1洛谷 P1879玉米地

入門 map namespace 記錄 方便 def 沖突 https i++

題目鏈接:https://www.luogu.org/problemnew/lists?name=1879

Code:

//2018-09-17 提高+
//狀壓dp 
#include<iostream>
#include<cstdio>
#define mod 100000000

using namespace std;

long long n,m,ans;
int map[13][13];
long long f[1<<12][13];
int y[13],sign[1<<12];

int main()
{
    scanf("%d%d",&n,&m);
    
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&map[i][j]); //記錄土地情況 for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) y[i]=(y[i]<<1)+map[i][j]; //合並土地情況 //方便後面判斷 //枚舉每一種狀態 //預處理左右不行的狀態
for(int i=0;i<(1<<m);i++) { if(!(i&(i<<1)) && !(i&(i>>1))) { sign[i]=1; //標記 if((i&y[1]) == i) f[i][1]=1; //如果這種狀態符合土地條件 //初始化f數組 } } for(int i=2;i<=n;i++)
//枚舉每一行 for(int j=0;j<(1<<m);j++) //枚舉上一行的狀態 if(((j&y[i-1])==j) && sign[j]) //如果土地肥沃,且當前狀態左右不沖突 for(int k=0;k<(1<<m);k++) //枚舉這一行的狀態 if(((k&y[i])==k)&&!(j&k)&&sign[k]) f[k][i]=(f[k][i]+f[j][i-1])%mod; //當前行的狀態只會收上一行的影響 for(int i=0;i<(1<<m);i++) ans=(ans+f[i][n])%mod; //記錄答案 cout<<ans; return 0; } //By Yfengzi

狀壓DP入門NO.1洛谷 P1879玉米地