栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

5 状态压缩Dp及其衍生

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

5 状态压缩Dp及其衍生

目录

1棋盘式(基于连通性)

1 蒙德里安的梦想

2 国王(井字形)

 3 玉米田(十字形)

4 炮兵阵地(十字形2)

2 集合式

1 愤怒的小鸟


1棋盘式(基于连通性)

1 蒙德里安的梦想

291. 蒙德里安的梦想 - AcWing题库

 

 

#include
using namespace std;
const int N=12,M=1<<11;
vector head;//用来记录第i层状态
vector state[M];//用来记录第i层状态下的满足条件的i-1层的状态
bool st[M];//用来标记有没有连续个偶数0
long long f[N][M];
int n,m;
bool check(int state)//用来处理一个数有没有偶数个0
{
    int cnt=0;
    for(int i=0;i>i&1)
         {
           if(cnt&1) return false;
           cnt=0;
         }
         else cnt++;
    if(cnt&1) return false;
    return true;
}
int main()
{
    while(cin>>n>>m,n||m)
    {
        memset(f,0,sizeof f);//刷新下一层状态
        head.resize(0);//刷新下一层状态
        for(int i=0;i<1< 

 

2 国王(井字形)

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

#include
using namespace std;
typedef long long ll;
const int N=12,M=1<<10,K=110;
vector state;//用来记录没有连续个1的数的合法状态
int cnt[M];//用来记录i这个数的国王数量
ll f[N][K][M];
vector head[M];//记录第i行的合法转移方案
int n,m;
bool check(int state)//用来判断有没有连续个1
{
    for(int i=0;i>i&1)&&(state>>i+1&1))
           return false;
    return true;
}
int count(int state)//用来求1的数量,也就是国王的数量
{
    int res=0;
    for(int i=0;i>i&1)
           res++;
    return res;
}
int main()
{
    cin>>n>>m;
    for(int i=0;i<1< 

 3 玉米田(十字形)

327. 玉米田 - AcWing题库

#include
using namespace std;
const int N=14,M=1<<12,mod=1e8;
vector state;//用来记录没有连续个1的数的合法状态
vector head[M];//记录第i行的合法转移方案
int f[N][M];
int g[N];//用来存每一行的不肥沃的地,也就是让不肥沃为1
int n,m;
bool check(int state)//用来判断有没有连续个1
{
    for(int i=0;i>i&1)&&(state>>i+1&1))
           return false;
    return true;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
      for(int j=0;j>a;
          if(!a) g[i]+=1< 

4 炮兵阵地(十字形2)

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

 

#include
using namespace std;
const int N=110,M=1<<10;
vector state;//用来记录三个连续位置的数中最多只有一个1的数的合法状态
int f[2][M][M];
int g[N];//用来存每一行的山地,也就是让山地为1
int cnt[M];//用来存合法数中1的个数
int n,m;
bool check(int state)//用来判断三个连续位置的数中最多只有一个1的数的合法状态
{
    for(int i=0;i>i&1)&&((state>>i+1&1)||(state>>i+2&1)))
           return false;
    return true;
}
int count(int state)//用来算一个数中1的个数
{
    int res=0;
    for(int i=0;i>i&1) res++;
    return res;
}
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
      for(int j=0;j>a;
          if(a=='H') g[i]+=1< 

2 集合式

1 愤怒的小鸟

信息学奥赛一本通(C++版)在线评测系统 (ssoier.cn)

#include
using namespace std;
#define x first
#define y second
#define db double
const int N=20,M=1<<18;
const db eps=1e-6;
typedef pair pdd;
int f[M];
pdd q[N];
int n,m;
int path[N][N];/
bool cmp(db x,db y)//因为浮点数会失精度,用来判断两个数是否相等
{
    if(fabs(x-y)>T;
   while(T--)
   {
       cin>>n>>m;
       for(int i=0;i>q[i].x>>q[i].y;
       memset(path,0,sizeof path);//清空上一维的状态
       for(int i=0;i0||cmp(a,0.0)) continue;//开口向下,所以a<0
               for(int k=0;k>j&1))
             {
               x=j;
               break;
             }
            for(int j=0;j 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/884164.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号