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 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> Codeforces 981D Bookshelves & 981E Addition on Segments 两道皆是dp -> 正文阅读

[数据结构与算法]Codeforces 981D Bookshelves & 981E Addition on Segments 两道皆是dp


题目链接就不放了.

981D Bookshelves

题意

长度为 n n n的序列,从左到右分为 k k k段,每段求和后计算二进制与,问计算出的最大值.
n ≤ 50 , a i ≤ 2 50 n\leq 50,a_i\leq 2^{50} n50,ai?250.

题解

考虑 d p dp dp.
不太好直接 d p dp dp,但是由于二进制数最高位起决定作用的性质,我们考虑按位 d p dp dp,从最高位向下枚举,每次判断 n n n个数是否可以分成 k k k段,使得这 k k k段的和按位与之后在第 i i i位能得到 1 1 1.
d p i j dp_{ij} dpij?表示前 i i i个数是否能够分成 j j j段满足条件,枚举 l ∈ [ 1 , i ? 1 ] l\in[1,i-1] l[1,i?1],如果 1 → l 1\to l 1l能分成 j ? 1 j-1 j?1段,则成立,代码为dp[i][j]|=dp[l][j-1]&&(sum[i]-sum[l]&x)==x;
在枚举后面的位数的时候,我们必须要把前面几位的判断也加上.
谢谢大家.

#include<bits/stdc++.h> //Ithea Myse Valgulious
using namespace std;
ll a[59],dp[59][59];
int main() {
  ll n,k,i;
  read(n),read(k);
  for (i=1;i<=n;++i) read(a[i]),a[i]+=a[i-1];
  auto ck=[&](ll x) {
    int i,j,l;
    memset(dp,0,sizeof dp),**dp=1;
    for (i=1;i<=n;++i) 
      for (j=1;j<=k;++j)
        for (l=i-1;~l;--l) 
          dp[i][j]|=dp[l][j-1]&&(a[i]-a[l]&x)==x;
    return dp[n][k];
  };
  ll zw=0;
  for (i=59;~i;--i) 
    zw|=ck(zw|1ll<<i)?1ll<<i:0;
  printf("%lld\n",zw);
}

981E Addition on Segments

题意

一开始整个序列均为 0 0 0,有一些区间加操作,问进行这些操作中的一部分能得到的全局最大值在 [ 1 , n ] [1,n] [1,n]有哪些.

题解

考虑 d p dp dp.
将操作按左端点排序,令 d p i dp_i dpi?表示最大值 i i i最远可以在哪个位置取到.
则本题变为一道背包,最终 [ 1 , n ] [1,n] [1,n]中值不为 0 0 0的全部都是答案.

#include<bits/stdc++.h> //Ithea Myse Valgulious
using namespace std;
const int yuzu=1e5;
typedef int fuko[yuzu|10];
struct lo {
  int l,r,v;
  void rd() {
    read(l),read(r),read(v);
  }
}g[yuzu];
fuko dp;
int main() {
  int n,m,i,j;
  read(n),read(m);
  for (i=0;i<m;++i) g[i].rd();
  sort(g,g+m,[&](lo a,lo b){return a.l<b.l;});
  for (*dp=yuzu,i=0;i<m;++i) {
    for (j=n-g[i].v;~j;--j)
      dp[j]>=g[i].l?dp[j+g[i].v]=max(dp[j+g[i].v],min(dp[j],g[i].r)):0;
  }
  vector<int> zw;
  for (i=1;i<=n;++i) if (dp[i]) zw.push_back(i);
  printf("%d\n",zw.size());
  for (int p:zw) printf("%d ",p);
}

谢谢大家.

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 13:41:03  更:2021-08-10 13:41:45 
 
开发: 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/25 18:24:20-

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