【动态规划】状态压缩dp

发现dp调试打最后二维dp表非常有用

1.吃奶酪类


先出状态,再走到哪

dp[1][0]=0;

for(int i=3;i<=maxn;i++){//状态
for(int j=1;j<=n;j++){//走过j
if(i&(1<<j)){
for(int k=0;k<=n;k++){//刚才在k
dp[i][j]=;
}
}
}
}

P1433 吃奶酪 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

#include<iostream>
#include<math.h>
using namespace std;
int n;
double INF=1000000000;
int maxn;//maxn不能在这里=

double a[21][2];
double dp[1024*1024+1][16];
double dis[16][16];



void solu(){


dp[1][0]=0;



for(int i=3;i<=maxn;i++){//0必然走过,>=3//状态
    for(int j=1;j<=n;j++){//走到哪个

        if(i&(1<<j)){
            for(int k=0;k<=n;k++){//走过上一个奶酪后,状态为i-(1<<j)
                    if((i-(1<<j))&(1<<k)){

                        dp[i][j]=min(dp[i][j],dp[i-(1<<j)][k]+dis[k][j]);
                    }

            }
        }
    }
}



double ans=INF;
for(int i=1;i<=n;i++)ans=min(ans,dp[maxn][i]);
printf("%.2lf",ans);

}

int main(){

cin>>n;
maxn=(1<<(n+1))-1;

a[0][0]=a[0][1]=0;
for(int i=1;i<=n;i++){
    cin>>a[i][0]>>a[i][1];
}

for(int i=0;i<=n;i++){
    for(int j=i+1;j<=n;j++){
        dis[i][j]=sqrt((a[i][0]-a[j][0])*(a[i][0]-a[j][0])+(a[i][1]-a[j][1])*(a[i][1]-a[j][1]));
        dis[j][i]=dis[i][j];
    }
    dis[i][i]=0;
}


for(int i=0;i<=maxn;i++){
    for(int j=0;j<=n;j++){
        dp[i][j]=INF;
    }
}

solu();
}

91. 最短Hamilton路径 - AcWing题库

n-1为终点

#include<iostream>
#define ll long long
#define INF 0x3f3f3f3f
using namespace std;
int n;
ll maxn;
ll dis[21][21];
ll dp[1024*1024+1][21];

void solu(){

dp[1][0]=0;
//i==3&&j==1真是个依赖项

for(ll i=3;i<=maxn;i++){
    for(int j=1;j<=n-1;j++){
        if(i&(1<<j)){
            for(int k=0;k<=n-1;k++){
                if((i-(1<<j))&(1<<k)){

                    dp[i][j]=min(dp[i][j],dp[i-(1<<j)][k]+dis[k][j]);
                }
            }
        }
    }
}
cout<<dp[maxn][n-1];
}

int main(){

cin>>n;
maxn=(1<<n)-1;

for(int i=0;i<=n-1;i++){
    for(int j=0;j<=n-1;j++)cin>>dis[i][j];
}

for(ll i=0;i<=maxn;i++)
for(int j=0;j<=n-1;j++){
    dp[i][j]=INF;
}

solu();
}

2.棋盘放置类


一行一行逐渐生成,

任何需要积累的,就记住生成头,和状态转化

for(int j=0;j<maxm;j++)//建议生成第一行,之后i=2开始遍历
    if(行内合法)dp[1][j]=1;

for(int i=2;i<=n;i++)//枚举n行
    for(int j=0;j<maxm;j++)//当前行状态
        if(行内合法)
            for(int k=0;k<maxm;k++)
                if(行内合法&&行间合法)
                    dp[i][j]+=dp[i-1][k];


2.1Corn Fields G

顺带,可以先预处理行内有效,因为每一行都用

状态枚举时for(int j=0;j<行内合法状态数;j++)

题目描述

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.

农场主 JohnJohn 新买了一块长方形的新牧场,这块牧场被划分成 M 行 N 列(1≤M≤12,1≤N≤12),每一格都是一块正方形的土地。 JohnJohn 打算在牧场上的某几格里种上美味的草,供他的奶牛们享用。

遗憾的是,有些土地相当贫瘠,不能用来种草。并且,奶牛们喜欢独占一块草地的感觉,于是 JohnJohn 不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边。

JohnJohn 想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择?(当然,把新牧场完全荒废也是一种方案)

输出格式

一个整数,即牧场分配总方案数除以 100,000,000100,000,000 的余数。

#include<iostream>
#define ll long long
using namespace std;
#define mod 100000000

ll n,m;ll maxm;
ll board[13];
ll dp[13][(1<<12)+1];
void solu(){

//像链表头一样,我们是单独处理的
for(ll j=0;j<maxm;j++){
        if(j&(j<<1))continue;
        if(!((j&board[1])==j))continue;
        dp[1][j]=1;
}

for(ll i=2;i<=n;i++)
    for(ll j=0;j<maxm;j++){
        if(j&(j<<1))continue;
        if(!((j&board[i])==j))continue;//j要是棋盘的子集
        for(ll k=0;k<maxm;k++){
            if((k&(k<<1))||(k&j))continue;
            if(!((k&board[i-1])==k))continue;

            dp[i][j]=(dp[i][j]+dp[i-1][k])%mod;
        }
    }
    ll ans=0;

for(ll j=0;j<maxm;j++)ans=(ans+dp[n][j])%mod;
cout<<ans;


}

int main(){

cin>>n>>m;
maxm=1<<m;


for(ll i=1;i<=n;i++){//每一行压缩成数
    for(ll j=0;j<m;j++){
            ll temp;cin>>temp;
        board[i]+=temp<<j;
    }

}

solu();

}

2.2互不侵犯

P1896 [SCOI2005] 互不侵犯 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

这里有要求放多少个,加上一维

生成第一行时,只有[num[j]]才有效

注意开到dp[10][1<<m][k<=n*n] 

#include<iostream>
#define ll long long
using namespace std;
ll n,s;
ll maxn;
ll dp[10][1025][101];
ll num[1025];
void solu(){
for(ll j=0;j<maxn;j++)
dp[1][j][num[j]]=1;

for(ll i=2;i<=n;i++){
    for(ll j=0;j<maxn;j++){
        if(j&(j<<1))continue;
        for(ll k=0;k<maxn;k++){
            if(k&(k<<1))continue;
            if((k&j)||(k&(j<<1))||(j&(k<<1)))continue;


            for(ll cnt=num[j];cnt<=s;cnt++)
            dp[i][j][cnt]+=dp[i-1][k][cnt-num[j]];
                //这里空间太多,没有滚动,正序也对


        }
    }

}
ll ans=0;

for(ll j=0;j<maxn;j++){
ans+=dp[n][j][s];



}
cout<<ans;
}
ll get_sum(ll x){
    ll sum=0;
while(x){
sum+=(x&1);
x>>=1;
}

return sum;
}

int main(){

cin>>n>>s;
maxn=1<<n;
for(ll i=0;i<maxn;i++){

num[i]=get_sum(i);
}

solu();

}

2.3Mondriaan's Dream

2411 -- Mondriaan's Dream (poj.org)

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

Mondriaan's Dream

Time Limit: 3000MSMemory Limit: 65536K
Total Submissions: 29311Accepted: 15608

Description

Squares and rectangles fascinated the famous Dutch painter Piet Mondriaan. One night, after producing the drawings in his 'toilet series' (where he had to use his toilet paper to draw on, for all of his paper was filled with squares and rectangles), he dreamt of filling a large rectangle with small rectangles of width 2 and height 1 in varying ways.


Expert as he was in this material, he saw at a glance that he'll need a computer to calculate the number of ways to fill the large rectangle whose dimensions were integer values, as well. Help him, so that his dream won't turn into a nightmare!

Input

The input contains several test cases. Each test case is made up of two integer numbers: the height h and the width w of the large rectangle. Input is terminated by h=w=0. Otherwise, 1<=h,w<=11.

Output

For each test case, output the number of different ways the given rectangle can be filled with small rectangles of size 2 times 1. Assume the given large rectangle is oriented, i.e. count symmetrical tilings multiple times.

Sample Input

1 2
1 3
1 4
2 2
2 3
2 4
2 11
4 11
0 0

Sample Output

1
0
1
2
3
5
144
51205

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/678776.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ARP欺骗的原理与详细步骤

ARP是什么&#xff1a; 我还记得在计算机网络课程当中&#xff0c;学过ARP协议&#xff0c;ARP是地址转换协议&#xff0c;是链路层的协议&#xff0c;是硬件与上层之间的接口&#xff0c;同时对上层提供服务。在局域网中主机与主机之间不能直接通过IP地址进行通信&#xff0c…

做ozon开单前需要多少钱,做ozon开单前需要多少钱

在电子商务的浪潮中&#xff0c;OZON平台以其独特的商业模式和市场定位&#xff0c;吸引了众多创业者和商家的目光。然而&#xff0c;在决定投身OZON平台之前&#xff0c;对开店成本的全面了解至关重要。本文将详细解析OZON开店前的各项费用&#xff0c;并提供一些高效投入的策…

go的反射和断言

在go中对于一个变量&#xff0c;主要包含两个信息变量类型&#xff08;type&#xff09;和变量值&#xff08;value&#xff09; 可以通过reflect包在运行的时候动态获取变量信息&#xff0c;并能够进行操作 对于Type可以通过reflect.TypeOf()获取到变量的类型信息 reflect.Ty…

网络服务DHCP的安装

DHCP的安装 检查并且安装dhcp有关软件包 rpm -qc dhcp #检查是否存在dhcp yum install -y dhcp #进行yum安装查看系统的配置文件 切换到对应目录查看相关文件配置&#xff0c;发现是空目录。 将官方提供的example复制到原配置文件中 cp /usr/share/doc/dhcp-4.2.5/dhcpd.…

This Python interpreter is in a conda environment

今天在查看python版本的时候出现警告 Warning: This Python interpreter is in a conda environment, but the environment has not been activated. Libraries may fail to load. To activate this environment please see https://conda.io/activation 这个警告意味着你…

Windows家庭版 WSL2非C盘详细安装配置与WSL代理设置+WSL基础环境CUDA安装

1 WSL2 配置 1.1 WSL 开启 注意&#xff1a;需要在windows功能中开启“Hyper-V”和“适用于Linux的Windows子系统”功能 但是&#xff01;windows家庭版&#xff08;windows home&#xff09;是默认没有Hyper-V功能的&#xff0c;自己手动安装&#xff1a; 创建一个记事本&a…

DeepDriving | 基于YOLOv8分割模型实现垃圾识别

本文来源公众号“DeepDriving”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;基于YOLOv8分割模型实现垃圾识别 0. 引言 YOLOv8是Ultralytics开源的一个非常火的AI算法&#xff0c;目前支持目标检测、实例分割、姿态估计等任务。…

Java List数据结构与常用方法

1.1 数据结构概述 Java的集合框架其实就是对数据结构的封装&#xff0c;在学习集合框架之前&#xff0c;有必要先了解下数据结构。 1.1.1 什么是数据结构 所谓数据结构&#xff0c;其实就是计算机存储、组织数据的方式。 数据结构是用来分析研究数据存储操作的&#xff0c;其实…

【Mac】Keyboard Maestro for Mac(键盘大师)软件介绍及安装教程

软件介绍 Keyboard Maestro for mac&#xff08;键盘大师&#xff09;是目前Mac OS平台上功能最为齐全的Mac键盘增强工具&#xff0c;它能将你的Keyboard作用发挥到极致&#xff0c;可以根据命令或计划自动执行简单或复杂的应用程序或网站&#xff0c;文本或图像。使用Keyboar…

力扣234. 回文链表

给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true # Definition for singly-linked list. # c…

Facebook开户 | Facebook海外三不限的价值

在当今数字化时代&#xff0c;海外数字营销已经成为企业推广和品牌建设的重要手段。在这个过程中&#xff0c;社交媒体平台扮演着至关重要的角色&#xff0c;而Facebook作为全球最大的社交媒体平台之一&#xff0c;其海外三不限账户近年来引起了越来越多数字营销从业者的关注。…

【数据结构与算法 | 二叉树篇】力扣101, 104, 111

1. 力扣101 : 对称二叉树 (1). 题 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false…

【Redis数据库】数据类型(2.3w字超详细)

文章目录 一、字符串类型概述1.1、数据类型1.2、字符串简介1.3、字符串应用场景 二、字符串命令三、哈希类型概述3.1、哈希介绍3.2、哈希类型应用场景3.3、哈希命令 四、列表类型概述4.1、列表简介4.2、使用场景4.3、列表命令 五、集合概述5.1、集合简介5.2、使用场景5.3、集合…

Vue.js 动画与过渡效果实战

title: Vue.js 动画与过渡效果实战 date: 2024/6/4 updated: 2024/6/4 description: 这篇文章介绍了如何在网页设计中使用过渡动画和组件效果&#xff0c;以及如何利用模式和列表展示信息。还提到了使用钩子实现组件间通信的方法。 categories: 前端开发 tags: 过渡动画组件…

VS 2022调试技巧:远程调试、线程检查、性能检查

&#x1f3c6;作者&#xff1a;科技、互联网行业优质创作者 &#x1f3c6;专注领域&#xff1a;.Net技术、软件架构、人工智能、数字化转型、DeveloperSharp、微服务、工业互联网、智能制造 &#x1f3c6;欢迎关注我&#xff08;Net数字智慧化基地&#xff09;&#xff0c;里面…

总交易量突破 3000 亿美元,APX Finance 成本轮牛市最大的黑马?

“APX Finance 总交易量现已突破 3000 亿美元&#xff0c;已然成为链上衍生品赛道的主力军” 自 2021 年链上衍生品市场进入萌芽期以来&#xff0c;该板块始终保持着较高的市场增速&#xff0c;即便如此该领域仍旧存在极大的发展空间。一方面&#xff0c;衍生品板块交易量目前占…

微信小程序发布遇到的一些问题记录

1.报错组件没有按需导入 在该路径配置微信小程序添加"lazyCodeLoading" : "requiredComponents" "mp-weixin" : { "appid" : "你的appid", "setting" : { "urlCheck" : f…

工业设备联网监控

在当今这个工业4.0和智能制造蓬勃发展的时代&#xff0c;如何对工业设备进行高效、智能的联网监控&#xff0c;已经成为众多企业关注的焦点。HiWoo Cloud平台以其卓越的联网监控能力和创新的技术应用&#xff0c;正成为更多企业的选择。今天&#xff0c;我们就来详细探讨一下Hi…

如何制作Peppol文件?

Peppol (Pan-European Public Procurement Online) 是一种用于跨境电子采购的标准协议和网络。它允许企业和政府机构以电子方式交换文件&#xff0c;如电子发票、订单和发货单。如果你需要制作Peppol文件&#xff0c;可以参考如下步骤&#xff1a; 准备必要工具和资源 1.Pepp…

STC设计与RTX51--RTX51操作系统

知不足而奋进 望远山而前行 目录 文章目录 前言 内容 操作系统 我们认知的操作系统 最小的操作系统 RTX51系统 RTX51 Real-Time Kernel RTX51 Tiny环境搭建 库函数与RTX51 RTX51的延时问题 K_TMO与K_IVL的区别 K_SIG信号等待 总结 前言 理解操作系统功能学会使用…