2015年ACM/ICPC合肥赛区 D题(状压dp)

题目链接:https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=5266

2015年ACM/ICPC合肥赛区 D题(状压dp)_第1张图片

2015年ACM/ICPC合肥赛区 D题(状压dp)_第2张图片

题意:

给你一个n*n(n<=1000)的网格,初始第一行每一列有一只青蛙。

有n个膜,第个膜覆盖第l[i]列到第r[i]列。

每个膜只有一颗长生不老药。n个青蛙会一直往上跳,直到跳到第n行。如果一个膜覆盖所有列,则是好膜,否则是坏膜。

每个青蛙不能穿过超过10个坏膜,每个青蛙都要吃到长生不老药。求方法总数。

思路:状压dp。太难想了。。。

dp[i][j]表示第i列膜状态为j时的方法总数。

ne[i][j]=k表示第i行膜状态为j转移到第i+1行时膜状态为k。k=-1表示不合法。

初始:dp[1][1<<(第一列膜总数)-1]=1;

代码:

#include
#define ll long long
using namespace std;
const int maxn=2050;
const ll mo=105225319;
int n,m,k;
ll dp[maxn][maxn];
int ne[maxn][maxn];
vectorvc[maxn];
ll jc[maxn];
int l[maxn],r[maxn];
void init()
{
    jc[0]=1;
    for(ll i=1;i10) return 0;
    for(int i=1;i

 

你可能感兴趣的:(状态压缩dp)