POJ3254Corn Fields题解动态规划DP

Corn Fields
Time Limit: 2000MS   Memory Limit: 65536K
Total Submissions: 2263   Accepted: 1131

Description

Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yummy corn for the cows on a number of squares. Regrettably, some of the squares are infertile and can't be planted. Canny FJ knows that the cows dislike eating close to each other, so when choosing which squares to plant, he avoids choosing squares that are adjacent; no two chosen squares share an edge. He has not yet made the final choice as to which squares to plant.

Being a very open-minded man, Farmer John wants to consider all possible options for how to choose the squares for planting. He is so open-minded that he considers choosing no squares as a valid option! Please help Farmer John determine the number of ways he can choose the squares to plant.

Input

Line 1: Two space-separated integers: M and N
Lines 2.. M+1: Line i+1 describes row i of the pasture with N space-separated integers indicating whether a square is fertile (1 for fertile, 0 for infertile)

Output

Line 1: One integer: the number of ways that FJ can choose the squares modulo 100,000,000.

Sample Input

2 3
1 1 1
0 1 0

Sample Output

9

Hint

Number the squares as follows:
1 2 3
  4  

There are four ways to plant only on one squares (1, 2, 3, or 4), three ways to plant on two squares (13, 14, or 34), 1 way to plant on three squares (134), and one way to plant on no squares. 4+3+1+1=9.

Source

USACO 2006 November Gold
状态压缩DP
第一道状态DP题,POJ2411看别人的代码学习状态压缩DP入门,然后运用于此题。搞了两天WA无数次终于AC。
二进制表示种植情况,1表示当前地种植,0不种植
当前行是上一行取反得到,就不会和上一行冲突了。
当前地能种植并且为1并且左边地没有种植时在当前地种植,当前地不种植时清零
记忆化搜索实现,dfs(i,s,p)表示第i行p列状态为s
DP状态:
d[i][j]表示第i行状态为j时方法数
状态转移方程:
d[i][s]+=d[i-1][last];
边界:
dfs(1,(1<
代码:
#include int d[15][1<<15],n,m,i,j,a[15][15],x,M,ans; void dfs(int i,int s,int p) { if(p==m) { d[i][s]=(d[i][s]+x)%100000000; return; } dfs(i,s&~(1<

你可能感兴趣的:(ACM题解)