poj2411 轮廓线dp

题意就是用1*2的矩形填充n*m的大矩形。问用多少种方案,即计数问题。

刚开始真的一点都不会,搜了一下,大部分都是用的状态压缩dp做的,

这样思路清晰,类似多段图一样:

利用滚动数组

for 上个阶段的每个节点j

   for j的每个后继节点 k

       dp[cur][k]+=dp[1-cur][j];

但是我想说的是,本题复杂度最优的思路是轮廓线dp。这和大白上的例题几乎一模一样。

大致思路是:

以每个格子为一个阶段,每个阶段有2^m个状态,m=min(n,m);

第(i,j)个格子根据上一个格子的状态,有三种情况,不放,竖着放,横着放。

我就不具体说,随便看一下别人的博客就知道了,但是我推荐看一下大白,这样才能真体会到

最经典的轮廓线思维方式。不要骂我不讲清楚思路,因为我没有能把你讲明白的那个水平,去看大白吧,p384。

代码如下:

#include
#include
#include
#include
using namespace std;
int n,m,cur;
const int maxn=15;
long long d[2][1<


 

 

你可能感兴趣的:(DP)