426 狀態(tài)壓縮DP 玉米田【動(dòng)態(tài)規(guī)劃】

老師給的代碼沒(méi)有滾動(dòng)數(shù)組優(yōu)化,老習(xí)慣,強(qiáng)迫癥。show you my code
```C++
#include?<iostream>
#include?<cstring>
#include?<algorithm>
using?namespace?std;
const?int?P?=?1e9;
int?n,?m;?????//行數(shù),列數(shù)
int?g[13];????//各行的狀態(tài)值
int?cnt;??????//同一行的合法狀態(tài)個(gè)數(shù)
int?s[1?<<?13];?//一行的合法狀態(tài)集
int?f[2][1?<<?13];
//f[i,a]表示已經(jīng)種植前i行,第i行第a個(gè)狀態(tài)時(shí)的方案數(shù)
int?main()?{
????cin?>>?n?>>?m;
????for?(int?i?=?1;?i?<=?n;?i++)
????????for?(int?j?=?1;?j?<=?m;?j++)?{
????????????int?x;
????????????cin?>>?x;
????????????g[i]?=?(g[i]?<<?1)?+?x;?//各行的狀態(tài)值
????????}
????for?(int?i?=?0;?i?<?(1?<<?m);?i++)?//枚舉一行所有狀態(tài)
????????if?(!(i?&?i?>>?1))??????//如果不存在相鄰的1
????????????s[cnt++]?=?i;?????????//保存一行的合法狀態(tài)
????f[0?&?1][0]?=?1;
????for?(int?i?=?1;?i?<=?n?+?1;?i++)?//枚舉行
????????for?(int?a?=?0;?a?<?cnt;?a++)?{?//枚舉第i行合法狀態(tài)
????????????f[i?&?1][a]?=?0;
????????????for?(int?b?=?0;?b?<?cnt;?b++)?//枚舉第i-1行合法狀態(tài)
????????????????if?(!(s[a]&s[b])????????//不能同列均為1
????????????????????&&?(s[a]&g[i])?==?s[a])?//種在肥沃土地上
????????????????????f[i?&?1][a]?=?(f[i?&?1][a]?+?f[(i?-?1)?&?1][b])?%?P;
????????}
????printf("%d\n",?f[(n?+?1)?&?1][0]);
????return?0;
}
```