ZOJ3777 - Problem Arrangement(状压DP)

无源元器件-电容选型参数总结 电容选型时,需要考虑的参数多种多样,这些参数的选择会直接影响到电路的性能、稳定性、成本等多个方面。本文对电阻电容磁珠电感的参数进行详细介绍并总结。 阅读详情

题目链接:

https://cn.vjudge.net/problem/ZOJ-3777


题目大意:

现在有一个N×N的矩阵,现在要求在这个矩阵里面取N个来自不同行不同列的数,使这个数大于给定的M。求总共有多少种取法。
(N < 12, M < 500)


解题过程:

组队赛时候的题,当初是暴力DFS的,当作简化的八皇后问题,结果当然是超时。

最近开始补题,正好在刷DP的题,于是顺手切了,算是一个状压DP的模板题。


题目分析:

首先看这个数据量,N和M的范围都非常小,显然可以拿来DP。一个题可以状态压缩,通常有几个量比较小,用来把状态压缩成二进制的数直接储存。

以DP的思路来讲,这题的状态应该是二维的,一个维度是存的状态压缩后的集合,另一个是储存的当前累加的和,DP数组是存的当前解的个数。

首先对于集合S,储存那些行已经有一个数被取了,这样可以保证一个无后效性,并且产生了许多重复子问题。如果前面已经取的点是集合S,并且前面的累加和是M。那么对于后面的数怎么取,有几个解,只需要计算一次即可。下一次如果一个状态仍是取的点的集合是S,并且累加和是M的话,那么直接用上一次计算的结果就可以了。

这样总共的复杂度是O(2^N*M),即状态总数。


记忆化搜索:

#include<bits/stdc++.h>
using namespace std;

#define LL long long

int dp[(1<<13)][600];
int n, m;
int data[112][112];

//计算阶乘
int fun(int n) {
    LL rst = 1;
    for (int i = 1; i <= n; i++) {
        rst *= i;
    }
    return rst;
}

int dfs(int dep, int num, int pre) {

    //递归边界
    if (dep >= n) {
        return num >= m;
    }

    int& ans = dp[pre][num];

    if (ans != -1)
        return dp[pre][num];

    ans = 0;

    //剪枝,如果当前已满足了,那么只需要计算下剩下的组合个数
    if (num >= m)
        return ans = fun(n-dep);

    for (int i = 0; i < n; i++) {
        if (pre&(1<<i))
            continue;
        int temp = pre|(1<<i);
        ans += dfs(dep+1, num+data[dep][i], temp);
    }
    return ans;
}



int main() {

    int T;
    scanf("%d", &T);
    while (T--) {
        memset(dp, -1, sizeof(dp));
        scanf("%d %d", &n, &m);

        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d", &data[i][j]);
            }
        }

        int aa = fun(n);
        int bb = dfs(0, 0, 0);

        if (bb != 0) {
            int cc = __gcd(aa, bb);
            aa /= cc;
            bb /= cc;
            printf("%d/%d\n", aa, bb);
        }
        else {
            printf("No solution\n");
        }
    }
}

递推:

#include<bits/stdc++.h>
using namespace std;

int dp[1<<13][666];
int data[112][112];

int fun(int n) {
    int rst = 1;
    for (int i = 2; i <= n; i++)
        rst *= i;
    return rst;
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        int n, m;
        scanf("%d %d", &n, &m);
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                scanf("%d", &data[i][j]);
            }
        }
        memset(dp, 0, sizeof(dp));

        //代表对于前0行,使和为0的取法有1种
        dp[0][0] = 1;


        //遍历每一种取法
        for (int i = 0; i < (1<<n); i++) {
            int cnt = 0;

            //计算取到了第几行
            for (int j = 0; j < n; j++) {
                if (i&(1<<j))
                    cnt++;
            }

            //尝试取下一个数
            for (int j = 0; j < n; j++) {
                if (i&(1<<j))
                    continue;

                //遍历取到的和,如果和大于M,那么加到M那里
                for (int k = 0; k <= m; k++) {

                    //这里的思想类似背包
                    if (k+data[cnt][j] >= m)
                        dp[i+(1<<j)][m] += dp[i][k];
                    else
                        dp[i+(1<<j)][k+data[cnt][j]] += dp[i][k];
                }
            }
        }
        int ans = dp[(1<<n)-1][m];
        if (ans == 0)
            printf("No solution\n");
        else {
            int aa = fun(n);
            int bb = __gcd(aa, ans);
            printf("%d/%d\n", aa/bb, ans/bb);
        }
    }
}
华为OD技术面八股_C++_05 汇总华为OD技术面C++方向技术面八股文,提供详细解答。 阅读详情

相关推荐

FPGA加速SNN实现MNIST手写数字识别的实践与优化

脉冲神经网络(SNN)作为第三代神经网络模型,采用生物启发的脉冲事件驱动机制,在处理时序信号时具有天然能效优势。其核心原理是通过神经元仅在接收足够输入脉冲时激活的稀疏特性,大幅降低计算能耗。在FPGA硬件加速领域,SNN通过量化优化、硬件友好型神经元模型设计等关键技术,可在边缘计算场景实现超高能效比。本文以MNIST手写数字识别为案例,详细解析了从6bit量化策略到双缓冲流水线设计的完整优化路径,最终在Xilinx Kintex-7平台实现97.54%识别准确率的同时,功耗仅231mW,能效比达81,712

weixin_30417487的博客 529

ZOJ 3777 11th省赛 B Problem Arrangement【状态压缩DP】

题目链接http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264思路题意就是n个题目,第i个题目放到第j个位置的有趣值是p[i][j],问你随机排列使得有趣值总和大于等于m的期望值是多少。 这个期望值很好算就是n!/cnt。直接dfs会超时,这里用到了DP,而DP的话,如果设dp[i][j]表示放了前i个题目,有趣值总和为j的方

初涉_代码世界 725

C# 开发 WPS 插件实战:从环境搭建到功能实现(附完整代码)

本文提供了一份详尽的C#开发WPS插件实战指南,涵盖从环境搭建到功能实现的完整流程。通过COM技术,开发者可以创建自定义插件,为WPS Office扩展自动化功能,如文档处理与格式转换。文章包含核心概念解析、Ribbon界面集成、调试部署方法及完整代码示例,帮助开发者快速上手。

rust6ferris的博客 928

Problem Arrangement

简单DP,用来求全排列的某个性质 题目的一个限制为和,所以DP增加一维

Confidence的专栏 1867

10-142 6-4 查询厂商“D“生产的PC和便携式电脑的平均价格

分数 10全屏浏览题目切换布局作者 lhm单位 河北农业大学本题目要求编写SQL语句,查询厂商D生产的PC和便携式电脑的平均价格。

dqd66的博客 2748

红外通信不止遥控器:手把手教你用2ASK调制实现语音+温度数据同传

本文详细介绍了如何利用2ASK调制技术实现红外通信系统,同时传输语音和温度数据。通过STM32F103C8T6微控制器和DS18B20温度传感器的硬件设计,结合2ASK调制原理,展示了系统的完整实现方案。文章还提供了调试优化建议,适合电子爱好者和通信工程学生实践学习。

weixin_42531588的博客 389

ZOJ 3300 Mahjong(DFS)

枚举1-9搜索就可以了. #include #include #include using namespace std; int tiles[10]; bool dfs(int curi,int melds,int eye){ if(melds==4&&eye==1)return true; if (curi>=10||eye>1||melds>4)return false; int

蚂蚁大战大象 568

ESM2蛋白预训练模型 蛋白质、氨基酸向量表示

参考: https://github.com/facebookresearch/esm https://huggingface.co/facebook/esm2_t33_650M_UR50D https://esmatlas.com/resources?action=fold tokenizer_对输入蛋白会头尾添加cls、eos特殊字符,占两个字符长度 参考:https://github.com/facebookresearch/esm 直接clone下来代码

weixin_42357472的博客 1万+

ZOJ - 3777 Problem Arrangement 【状压dp】

Problem Arrangement Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the o

Puya的博客 620

把慢点掰开看:在 SAP HANA 中启用 SQL 优化耗时跟踪 SqlOptTime 的实战指南

摘要:SAP HANA 性能排查中,常出现SQL查询时快时慢的现象,表面看似执行问题,实则是编译阶段耗时过长。通过SQL优化跟踪工具SqlOptStep和SqlOptTime,可精准区分编译与执行时间。SqlOptStep展示优化树变化过程,而SqlOptTime则记录各阶段耗时,帮助定位问题根源。启用SqlOptTime需配置traceprofile,建议限定特定用户以减少系统负载。实际案例显示,报表响应慢常由计算视图编译(CeQo)导致,而非执行阶段问题。解决方案包括调整计算视图展开方式或优化基础视图结

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1009

【MATLAB例程】三维下的IMM(交互式多模型),模型使用CV(匀速)和CA(匀加速),滤波使用EKF。附完整代码

CV模型:状态包含位置、速度和零加速度(9维状态),状态转移矩阵忽略加速度项CA模型:完整包含位置、速度和加速度(9维状态),状态转移矩阵包含二次项过程噪声矩阵Q分别根据两种模型的运动特性推导。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 561

zoj 3777 Problem Arrangement 【状压dp】

Problem Arrangement Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the

世界很大 458

C#上位机+国产PLC+AI:构建自主可控的智能生产线解决方案

全栈国产化智能产线方案并非遥不可及,基于成熟的国产硬件、丰富的.NET生态、快速发展的国产大模型,完全可以搭建出稳定可靠且具备智能能力的生产系统。落地建议采用三步走策略:基础国产化阶段:替换PLC与上位机,实现基础监控与控制功能,解决卡脖子问题,快速验证国产化方案稳定性数据沉淀阶段:完善数据采集与存储,建立设备台账、故障库、工艺库,积累高质量领域数据智能升级阶段:引入国产大模型与知识库,落地故障诊断、工艺优化、预测性维护等智能应用,持续提升产线效率。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 522

ZOJ 3777 Problem Arrangement 状压dp

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264 题意: 给定一个n*n的矩阵,在矩阵中选n个数字(每行每列只能选一个数字),问选出的数字和>=m的方法数 思路: 1、矩阵较小可以状压 2、每次转移以 数字和为记录,因为mm,可以视为m 相当于一个全排列中找方法数 即把n个数填入n个空格内

九野的博客 2915

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

zoj 3777 Problem Arrangement(状压dp)

题目链接The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the order of the problems. As we know, the arrangement will have a great effec

ciel_s的博客 504

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

ZOJ - 3777 Problem Arrangement(状压dp)

题目链接 题意:a[i][j]表示第i个数字放在第j位能得到的值,求所有排列顺序值的总和大于等于m的期望。 题记:n个数的排列顺序一共有n!个。直接枚举出所有排列顺序的话最大有12!个(479001600),所以必定是会超时的。所以要用状压dp取解决。 首先排列的数字一定是n个,那么我们用一个长度为n的二进制数去表示状态。1表示数字已经填了,0表示还没填。 例如:0000011表示第六第七个数字已经填了,其余的还没填。 dp[i][j]表示在i的这个状态值为j。j的值最大取到m。 #include<i

moyangxian 189

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

ZOJ 3777 Problem Arrangement-状压dp

http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3777 输入n,m; 给一个n*n的矩阵,mp[i][j]表示第i题选题目j会有 相应的得分 让你选择一个序列,求序列得分超过m的个数 n《12,m 可以把12种状态压位到一个int dp[i][j] 中的i有cnt个1,表示选了前cnt题,那么接下来

缺氧 620

ZOJ 3777 Problem Arrangement (状压DP)

分析:题目要求数学期望,其实就是求最终值≥M\ge{M}的概率。暴力的做法:找出所有排列方式,一个一个找:o(12!)o(12!),贵了。对数据敏感的话,应该比较容易想到状压。 dp[i][msk][j]dp[i][msk][j]代表前ii个数用了mskmsk状态的数,和为jj的排列总数。 那么转移方程: dp[i][msk][j]=∑msk第k位为1dp[i−1][msk|1<<k][j−p

无限大な梦のあとの 何もない世の中じゃ 553

ZOJ 3777 Problem Arrangement ( 状压dp )

题目链接 大致题意: 输入 nnn 和 mmm,接下来一个 n∗nn*nn∗n 的矩阵,mp[i][j]mp[i][j]mp[i][j] 表示第 iii 道题放在第 jjj 个顺序做可以加 mp[i][j]mp[i][j]mp[i][j] 的分数,问做完 nnn 道题所得分数大于等于 mmm 的概率。用分数表示,分母为上述满足题意的方案数,分子是总的方案数,输出最简形式。 解题报告: 状压 dpdpdp,枚举所有 题目被选举的状态。 dp[i][j]dp[i][j]dp[i][j] 表示 iii 状态下得

qhq889的博客 180

ZOJ - 3777 Problem Arrangement(状压dp)

题目链接:点击查看 题目大意:给出n道题,以及不同题目不同时间的兴趣值,p[i][j]代表的是第j道题放在第i个位置做的时候可以得到的兴趣值,问有多少种排列组合的方式能让最后做完所有题目的兴趣值大于等于m 题目分析:因为涉及到先后顺序问题,所以用状态压缩更容易实现枚举和状态转移,所以这个题要用状态压缩来解决。dp[i][j]代表的是状态为i时兴趣值为j的方案数,那么我们最后只需要判断一下dp[...

Falcon的博客 399

ZOJ - 3777 Problem Arrangement (状压dp)

The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the order of the problems. As we know, the arrangement will have a great effect o...

dsaghjkye的博客 220

【ZOJ】3777Problem Arrangement(状压DP题解)

Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange the order of the problems. As ...

红点雷龙XL 342

【状压DP】 ZOJ 3777 Problem Arrangement

点击打开链接 题意:N道题目,排序,每道题在不同的位置得到的值不同。 求随机排序后得到值大于等于m的期望次数。 因为是随机排序,所以概率就是  总数/可行数 #include #include #include #include #include using namespace std; #define ll long long int n,m,t; int a[

Kewowlo 788

zoj 3777 Problem Arrangement (好状压dp)

Problem Arrangement Time Limit: 2 Seconds      Memory Limit: 65536 KB The 11th Zhejiang Provincial Collegiate Programming Contest is coming! As a problem setter, Edward is going to arrange th

To be what you what to be! 1670

ZOJ 3777 Problem Arrangement(状压DP)

题目链接 :http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264 //今年省赛的题目,比赛的时候知道是状压却一直没搞出,直到最后。虽然赛后知道做法,也一直没做的,最近想不开就来做了 - -, 顺便用了下快速枚举k-子集。 恩, 做法么就是开dp[i][j] i已经选过了的题目的一个集合,j表示的是获得了j分,然后就可以...

weixin_30823227的博客 90

ZOJ 3777 - Problem Arrangement(状压DP)

题目: http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5264 题意: 给出n*n的矩阵,从中选出n个数,任意两个数在不同行不同列,求出总和大于m的方案数。 思路: 因为给出的矩阵比较小(n dp[i][s][k] 表示到第i行状态为s总和为j 的方案数。 总和j>m时当做m。 因为转移的时候i只与前一行有关,

Halo 771
上一篇: 第八届acm山东省赛总结
下一篇: POJ1182 - 食物链(带权并查集)
ACM_Fish
博客等级 码龄10年 69粉丝 76原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值