IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 2022春季力扣杯T4-守护太空城(状压DP) -> 正文阅读

[数据结构与算法]2022春季力扣杯T4-守护太空城(状压DP)

在这里插入图片描述在这里插入图片描述

在这里插入图片描述

思路

  • 由于时间取值空间较小,因此考虑在时间的维度上进行状态压缩
  • 由于仅有联合屏障影响连续的2个结点,枚举每个点在每个时间所使用的联合屏障情况(使用五位二进制压缩,第i位为1当且仅当在该时间点使用联合屏障
  • 转移的限制:
    • 与前面一个结点使用的联合屏障互不相交
    • 如果当前结点还有遭受撞击的时刻,只能单独开屏障
class Solution {
public:
    int defendSpaceCity(vector<int>& time, vector<int>& position) {
        int max_time = 0;
        int max_pos = 0;
        for(int i : time) {max_time = max(max_time,i);}   //max_time的最大值
        for(int i : position) {max_pos = max(max_pos,i);}
        vector<int> q[1 << max_time];
        for(int i = 0;i<(1 << max_time);i++)  //预处理无交集的集合
        {
            for(int j = 0;j<(1 << max_time);j++)
            {
                int u = 4;
                bool flag = true;
                while(u>=0)
                {
                    if(((i >> u) & 1) == 1 && ((j >> u) & 1) == 1)
                    {flag = false;break;}
                    u--;
                }
                if(flag) q[i].push_back(j);
            }
        }
        int s[1 << max_time];
        int p[1 << max_time];
        for(int i = 0;i<1<<max_time;i++)
        {
            int k = 0;
            int u = 0;
            while(u <= max_time - 1 && ((i >> u) & 1) == 0)  u++;
            bool flag = true;
            while(u<=max_time -1)
            {
                if(flag) k+=2; else k++;
                u++;
                while(u <= max_time - 1 && ((i >> u) & 1) == 1) k++,u++;
                int num_zero = 0;
                while(u <= max_time - 1 && ((i >> u) & 1) == 0) num_zero++,u++;
                if(u<=max_time - 1)
                {
                    if(num_zero <= 1) k+=num_zero,flag = false;
                    else flag = true;   //重启
                }
            }
            s[i]=k;
            
            k=0,u=0,flag = true;
            while(u <= max_time - 1 && ((i >> u) & 1) == 0)  u++;
            while(u<=max_time -1)
            {
                if(flag) k+=3; else k++;
                u++;
                while(u <= max_time - 1 && ((i >> u) & 1) == 1) k++,u++;
                int num_zero = 0;
                while(u <= max_time - 1 && ((i >> u) & 1) == 0) num_zero++,u++;
                if(u<=max_time - 1)
                {
                    if(num_zero <= 0) k+=num_zero,flag = false;
                    else flag = true;   //重启
                }
            }
            p[i] = k;
        }
        //每个pos被攻击的情况
        map<int,int> c;
        for(int i = 0;i<time.size();i++) c[position[i]] |= (1 << (time[i] - 1));
        int dp[max_pos + 1][1 << max_time];
        for(int i = 0;i<max_pos + 1;i++) 
            for(int j = 0;j<1<<max_time;j++)
                dp[i][j] = INT_MAX;
        for(int j = 0;j<1 << max_time;j++) 
        {
            dp[0][j] = s[c[0] & (~j)]+p[j];
        }

        for(int i = 1;i<max_pos + 1;i++)
        {
            for(int j = 0;j<1 << max_time;j++)
            {
                for(int k : q[j])
                {
                    dp[i][j] = min(dp[i-1][k]+s[c[i] & (~j) & (~k)]+p[j],dp[i][j]);

                }
            }
        }
        //system("pause");
        return dp[max_pos][0];
    }
};
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-04-18 18:07:50  更:2022-04-18 18:12:11 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 7:48:25-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码