朝题夕解之动态规划(5)

简介: 朝题夕解之动态规划(5)

题目描述(题目难度:中等)

微信图片_20221018144254.jpg

解题报告


输出解读

输入:
3
1 2 3
输出:
4

1,2,3总共有6个子集:

[1]----->1的异或和是1,

[2]---->2的异或和是2,

[3]---->3的异或和是3,

[1,2]---->1和2的异或和是3,

[1,3]---->1和3的异或和是2,

[2,3]---->2和3的异或和是1,

[1,2,3]---->1和2和3的异或和是0


其中, 2, 3是质数,所以有4个子集

分别是:[2]、[3]、[1,2]、[1,3]


背景抽象


读到题目中说:“给出 n nn 个互不相同的正整数。”那么每一个要么被选1次,要么一次都选不到。因此就可以向咱们可爱的额01背包方向考虑。

微信图片_20221018144411.png

DP分析

微信图片_20221018144440.jpg

注意事项


一、范围的选取

数据范围最大的数是5000, 而212 = 4096,不够5000。因此考虑异或和最大的数是 213 - 1

二、滚动数组优化

倘若不使用滚动数组,直接开空间的话,f [ n ] [ m ] f[n][m]f[n][m]中第一维至少是5000,第二维至少是213。那么所用空间 = 5000 * 213 个int 。


1MB=1024KB=1048576字节

一个int有4个字节,也就是1MB有262144个int。就大致算作250000个int吧。

那么所用的空间大致是156MB以上了。远远大于了题目所给的64MB。

微信图片_20221018144545.png

因此考虑使用滚动数组进行优化。所用空间大致是 2 * 213个int。


参考代码

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
const int N = 1e4 + 10, M = 8192, MOD = 1e9 + 7;
int f[2][M];//使用滚动数组优化
int n;
int a[N];
//试除法判断x是否是质数
bool check(int x) {
    for (int i = 2 ; i <= x/i ; i ++) {
        if (x % i == 0)
            return false;
    }
    return true;
} 
int main() {
    //读入
    cin >> n;
    for (int i = 1 ; i <= n ; i ++) cin >> a[i];
    //背包DP
    f[0][0] = 1;//方案初始化
    for (int i = 1 ; i <= n ; i ++) {
        for (int j = 0 ; j < M ; j ++) {
            f[i & 1][j] = f[i - 1 & 1][j];
            if ((j ^ a[i]) < M)
                f[i & 1][j] = (f[i & 1][j] + f[i - 1 & 1][j ^ a[i]]) % MOD; 
        }
    }
    //枚举所有异或和是质数的可能,统计个数
    int res = 0;
    for (int i = 2 ; i < M ; i ++) {
        if (check(i))
            res = (res + f[n & 1][i]) % MOD;
    }
    cout << res << endl;
    return 0;
}
相关文章
|
JavaScript C# 开发工具
22款Visual Studio Code实用插件推荐
Visual Studio Code是一个轻量级但功能强大的源代码编辑器,轻量级指的是下载下来的Visual Studio Code其实就是一个简单的编辑器,强大指的是支持多种语言的环境插件拓展,也正是因为这种支持插件式安装环境开发让Visual Studio Code成为了开发语言工具中的霸主,让其同时支持开发多种语言成为了可能。俗话说的好:“工欲善其事,必先利其器”,安装一些实用插件对自己日常的开发和工作效率能够大大的提升,避免996从选一款好的开发插件开始。以下是我整理的一些比较实用的Visual Studio Code插件希望对大家有用,大家有更好的插件推荐可在文末留言🤞。
565 0
|
缓存 安全 前端开发
CORS——跨域请求那些事儿
【本期嘉宾介绍】睿得,具有多年研发、运维、安全等IT相关从业经历。目前从事CDN、存储、视频直播点播的技术支持。
4471 0
|
8月前
|
安全 网络协议 网络安全
Hyper-V无连接,常见原因及修复
Hyper-V无连接问题可能由虚拟交换机配置、网络适配器驱动、IP设置、防火墙、BIOS、Hyper-V服务、虚拟机系统及物理网络等多方面引起。解决时需逐一排查:确认虚拟交换机绑定正确、驱动兼容、IP配置无误、防火墙规则适当、BIOS启用虚拟化技术、Hyper-V服务正常运行、虚拟机系统网络完好以及物理网络设备功能正常。若仍无法解决,建议寻求专业技术支持。
1084 17
|
人工智能 持续交付 开发者
通义灵码:加速个人成长与团队协作的最佳实践
从首个AI代码助手——通义灵码公测至今已有一年。作为云服务商运维工程师,我通过使用通义灵码的个人版和企业版,体验到了其在项目启动、代码调试、团队协作等方面的强大功能。个人版的 @workspace 和 @terminal 功能帮助我快速上手新项目,企业版的 #team docs 和自动化工作流则显著提升了团队协作效率。以下是具体使用心得和案例分享。
718 57
|
存储 Ubuntu 关系型数据库
Ubuntu端Sidecar安装及Web界面设置
本文主要是对Sidecars的配置,以下方法经过本人的亲自测试,亲测有效,放心大胆使用。
420 0
Ubuntu端Sidecar安装及Web界面设置
|
图形学
【制作100个unity游戏之26】unity2d横版卷轴动作类游戏7(附带项目源码)
【制作100个unity游戏之26】unity2d横版卷轴动作类游戏7(附带项目源码)
360 1
|
SQL XML Java
[Java Web]Mybatis->超八千字详细介绍,带你由浅入深认识了解mybatis(上)
[Java Web]Mybatis->超八千字详细介绍,带你由浅入深认识了解mybatis
220 0
|
消息中间件 运维 中间件
阿里开源消息中间件RocketMQ的前世今生
昨天,我们将分布式消息中间件RocketMQ捐赠给了开源软件基金会Apache。 孵化成功后,RocketMQ或将成为国内首个互联网中间件在Apache上的顶级项目。
16553 107
|
Java 程序员
【Java】已解决java.io.UnsupportedEncodingException异常
【Java】已解决java.io.UnsupportedEncodingException异常
632 0
|
JSON JavaScript 前端开发
axios详解以及完整封装方法
axios详解以及完整封装方法
1249 0