首页 > 其他分享 >2023.04.16总结

2023.04.16总结

时间:2023-04-16 23:22:45浏览次数:38  
标签:总结 连边 连通 le 16 int 2023.04 dp mod

题目1:

题意

  • 有 \(2n\) 个点,\(3n - 2\) 条边的无向图,对于 \(i(1 \le i \le n)\),\(i, i + n\) 连边,并且对于 \(i(1 \le i \le n - 1)\),\(i, i + 1\) 以及 \(i + n, i + n + 1\) 连边。问对与 \(i = 1, 2, 3, \dots, n - 1\),有几种删 \(i\) 条的边方式使图连通, 答案对质数 \(mod\) 取模。

  • \(1 \le n \le 3005\)。

思路

  • 首先我们先不考虑栅极条边的方案数,先想有几种删边方案是的图连通。

  • 我们先只考虑前 \(i\) 列,如果前 \(i\) 列不连通,则上下两排不连通的一定是一段后缀,否则就永远无法连通了,也就是非法的。

  • 所以我们需要考虑前 \(i\) 列连通和不连通的方案数(不连通一定合法)。左右图展示了 \(8\) 种情况,左边是第 \(i - 1\) 列,右边是第 \(i\) 列,第 \(i - 1\) 列的两个点是否连边表示两个点是否连通。左图是选完边后前 \(i\) 列连通的情况,右图为不连通(右图为合法的)。

  • 可以发现列从小到大,状态是转移都出来了 (状态:前 \(i\) 列连通和不连通的方案数(合法),转移就在上图),那不就是 \(dp\) 吗?

  • 现在我么回归正轨,题目是问有几种删 \(i\) 条的边方式使图连通,那该怎么办了?其实就是多开一维状态 \(dp_{i, j, k}\) 表示前 \(i\) 列删边 \(j\) 条使前 \(i\) 列连通或不连通的方案数,转移就是:

dp[i][j][1] = (dp[i - 1][j - 1][1] * 3 + dp[i - 1][j][1] + dp[i - 1][j][0]) % mod;
dp[i][j][0] = (dp[i - 1][j - 1][0] + (j > 1 ? dp[i - 1][j - 2][1] * 2 : 0)) % mod;
  • 初始状态:\(dp_{1, 1, 0} = 1, dp_{1, 0, 1} = 1\),目标状态:\(dp_{n, 1, 1}, dp_{n, 2, 1}, \dots dp_{n, n - 1,1}\)。

  • 时间复杂度:状态数:\(O(n^2)\),转移数:\(O(n^2)\),总时间复杂度:\(O(n^2)\)。

const int MAXN = 3005;

int n, mod;
long long dp[MAXN][MAXN][2];

int main() {
  ios::sync_with_stdio(0), cin.tie(0);
  cin >> n >> mod;
  dp[1][0][1] = 1, dp[1][1][0] = 1;
  for (int i = 2; i <= n; i++) {
    dp[i][0][1] = 1;
    for (int j = 1; j < n; j++) {
      dp[i][j][1] = (dp[i - 1][j - 1][1] * 3 + dp[i - 1][j][1] + dp[i - 1][j][0]) % mod;
      dp[i][j][0] = (dp[i - 1][j - 1][0] + (j > 1 ? dp[i - 1][j - 2][1] * 2 : 0)) % mod;
    }
  }
  for (int i = 1; i < n; i++) {
    cout << dp[n][i][1] << ' ';
  }
  return 0;
}

标签:总结,连边,连通,le,16,int,2023.04,dp,mod
From: https://www.cnblogs.com/xhr0817-blog/p/17324324.html

相关文章

  • leetcode160-相交链表
    leetcode160方法一:哈希表思路:先创建一个unordered_set,存放ListNode*类型的变量先遍历其中一个链表,把所有节点的指针放在set中再遍历另一个链表,查找是否存在一个节点已经在set中,如果存在则说明这是它们的相交节点的指针,返回这个指针,如果不存在则说明不存在相交节点,......
  • 4.16 周报
    4.16周报本周总结查漏补缺,练了一部分数学题方向搜索,树状数组,数学做题情况搜索3,树状4,数学3......
  • 每日总结
       这是今天写的页面,有些简陋,以后在修饰......
  • 2023.4.16编程一小时打卡
    一、问题描述:线性代数里面我们学习过n维向量,请用类vector_N来封装n维整型向量,成员如下;私有数据成员: 向量维数n,int型指针p,int型公有函数成员:无参默认构造函数,在该函数中,将n置0,将p置null;重载输入输出运算符,输入运算符,先指定向量维数,若输入为非正整数,则提示错误信息,“Error......
  • C++ 20 协程总结
    C++20协程总结介绍C++20提供的是非对称的、一等对象、无栈的协程(CoroutinesinC++20areasymmetric,first-class,andstackless)所谓协程,即用户级线程,一种用于将异步代码同步化的编程机制,使得程序的执行流可以在多个并行事务之间切换但又不必承担切换带来的过高的性能损耗。......
  • 4.16趣味百题第十题
    一问题描述输入一个M进制的数x,实现对x向任意的一个非M进制的数的转换。二设计思路利用进制转化的基数与权进行转化。可以先把当前数转化为十进制,接着转化为为别的进制。利用数字与字符的转化实现不同进制的数字存储。三流程图四代码实现(c++)#include<iostream>using......
  • 4.16每日总结
      今天完成了数据库表的大致构建。  昨天完成了人脸识别接口的调用,和界面构建的大致代码。   遇见的问题,匹配用户操作流程的数据表结构应该是什么样的?如何和团队数据库不同表之间的连接?......
  • 4月11日总结
    在JS中操作JSON1.创建JSON对象varjson={“name1”:”value1”,”name2”:”value2”,“name3”:[1,”str”,true]};varjson=[{“name1”:”value1”},{“name2”:”value2”}];2.JSON对象转换为JSON字符串JSON.stringify(JSON对象)3.JSON字符串转换为JSON对象JSON.......
  • 4月15日总结
    IP冲突引起的网络异常,可以通过检查IP是否冲突,排除故障。我们可以用一些工具进行检查,例如arp-scan、arping软件进行查看。这里使用arping进行检查设备的MAC地址,通过查查看MAC地址是否唯一,从而判断IP是否冲突,原理:每台设备的MAC地址是唯一的,若arping返回的MAC出现2个甚至多个,说明这......
  • 4月13日总结
    ELF格式的目标文件和可执行文件在结构上没有本质差异,ELF不仅仅描述目标文件,也用于描述可执行文件,Windows下的dll和.lib,Linux下的.so和.a文件都是按照类ELF格式存储,下图描述了ELF链接视图(.o文件、.so文件)和执行视图,链接视图描述了各个段(section)的组成,如.text、.data、bss段。执......