CF1528B Kavi on Pairing Duty(dp)
题目传送门
思路
这道题真的是一道不太好想的dp…真的太菜了
首先状态转移分成两种情况
- 区间长度相等的情况,如
这种情况就是看看你现在的区间有几个约数,那么代表有几种这样的situation
记为v[i]
- 包含情况,如
dp[i]+=dp[i-1]
dp[i]+=dp[i-1]
这样的就是dp[i]+=dp[i-1]+dp[i-2]
当然还有这样的
这样的就是,两个区间交替,外层区间谁也没有包谁那么就是
dp[i]+=dp[i-2]
那么状态转移方程就是
dp[i]=dp[i−1]+dp[i−2]+...+dp[2]+dp[1]+v[i]dp[i]=dp[i-1]+dp[i-2]+...+dp[2]+dp[1]+v[i]dp[i]=dp[i−1]+dp[i−2]+...+dp[2]+dp[1]+v[i]
#include<iostream>
using namespace std;
typedef long long ll;
ll dp[2102100];
ll v[2102100];
const ll modd=998244353;
int main(){ll n;cin>>n;for(ll i=1;i<=n;i++){for(ll j=i;j<=n;j+=i) v[j]++;}dp[1]=1;ll sum=dp[1];for(ll i=2;i<=n;i++){dp[i]+=sum;dp[i]%=modd;dp[i]+=v[i];sum+=dp[i];sum%=modd;dp[i]%=modd;}cout<<dp[n]<<endl;
}
重做笔记
#include<iostream>
#include<cstring>
using namespace std;
typedef long long ll;
const ll N=998244353;
ll dp[2102100];
ll s[2102100];
ll sum;
int main(){int n;cin>>n;//memset(s,1,sizeof s);//s[1]=1;for(int i=1;i<=n;i++)for(int j=1;j<=n/i;j++)s[i*j]++,s[i*j]%=N;//cout<<s[2]<<endl;for(int i=1;i<=n;i++){dp[i]=sum+s[i];sum+=dp[i];dp[i]%=N;sum%=N;}cout<<dp[n]<<endl;
}
枚举那块千万要优化,否则时间复杂度让你难以想象!!!(就是s数组)
UPD:2021/10/28
这个题的思路其实这块不难推:
dp[i]=dp[i−1]+dp[i−2]+dp[i−3]+....dp[1]+?dp[i]=dp[i-1]+dp[i-2]+dp[i-3]+....dp[1]+?dp[i]=dp[i−1]+dp[i−2]+dp[i−3]+....dp[1]+?
当前的状态一定是前面的状态的前缀和,但是如何想到枚举因数?我们通过分析每一个状态其实不难得到,当前dp其实就是继承前面的每一个状态,而当前的状态也一定可以排列出一种非继承的状态,也就是没有外部包装的状态,那么我们就可以进行下面的递推,那就是将这n个点,可以分成多少个整数组,这个整数组则就是新的衍生状态,每一个组之间的线对不相互影响,每一组刚好就是一个答案,素以我们在最后加上当前的枚举的i包含多少个因子即可。
#include<iostream>
using namespace std;
#define int long long
const int mod=998244353;
int v[2102100];
int dp[2102100];
signed main(){int n;dp[1]=1;for(int i=1;i<=1000000;i++){for(int j=1;j*i<=1000000;j++){v[j*i]++;}}int tot=1;for(int i=2;i<=1000000;i++){dp[i]+=(v[i]+tot)%mod;tot+=dp[i];tot%=mod; }cin>>n;cout<<dp[n]<<endl;}
CF1528B Kavi on Pairing Duty(dp)相关推荐
- 思维dp ---- Codeforces Round #722 (Div. 1) B. Kavi on Pairing Duty [思维dp + 数学]
题目大意: 将2n2n2n个点两两相连形成n对,对于任意两个点对A和B,要求至少满足其中一条: 1.A和B的某一个完全包含于另一个中 2.A和B的长度相等.问你一共有多少种方案. 解题思路: 题解:假 ...
- 求三角形最大面积(DP)
求三角形最大面积(DP) 在OJ上奇迹般WA了:WA:70. Why? #include <iostream> #include <string.h> using namesp ...
- LeetCode 编辑距离 II(DP)
1. 题目 给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数. 你可以对一个单词进行如下两种操作: 删除一个字符 替换一个字符 注意: 不允许插入操作 题目保证有解 示例: ...
- LeetCode 1220. 统计元音字母序列的数目(DP)
文章目录 1. 题目 2. 解题 1. 题目 给你一个整数 n,请你帮忙统计一下我们可以按下述规则形成多少个长度为 n 的字符串: - 字符串中的每个字符都应当是小写元音字母('a', 'e', 'i ...
- LeetCode 265. 粉刷房子 II(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成 k 种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同. 当然,因为市场上不同颜色油 ...
- LeetCode 256. 粉刷房子(DP)
文章目录 1. 题目 2. 解题 1. 题目 假如有一排房子,共 n 个,每个房子可以被粉刷成红色.蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其与相邻的两个房子颜色不能相同. 当然,因 ...
- LeetCode 1223. 掷骰子模拟(DP)
1. 题目 有一个骰子模拟器会每次投掷的时候生成一个 1 到 6 的随机数. 不过我们在使用它时有个约束,就是使得投掷骰子时,连续 掷出数字 i 的次数不能超过 rollMax[i](i 从 1 开始 ...
- LeetCode 1155. 掷骰子的N种方法(DP)
1. 题目 这里有 d 个一样的骰子,每个骰子上都有 f 个面,分别标号为 1, 2, -, f. 我们约定:掷骰子的得到总点数为各骰子面朝上的数字的总和. 如果需要掷出的总点数为 target,请你 ...
- LeetCode 1139. 最大的以 1 为边界的正方形(DP)
1. 题目 给你一个由若干 0 和 1 组成的二维网格 grid,请你找出边界全部由 1 组成的最大 正方形 子网格,并返回该子网格中的元素数量.如果不存在,则返回 0. 示例 1: 输入:grid ...
- 程序员面试金典 - 面试题 17.23. 最大黑方阵(DP)
1. 题目 给定一个方阵,其中每个单元(像素)非黑即白. 设计一个算法,找出 4 条边皆为黑色像素的最大子方阵. 返回一个数组 [r, c, size] ,其中 r, c 分别代表子方阵左上角的行号和 ...
最新文章
- bootstrap-datetimepicker时间控件添加清除按钮
- Cell Stem Cell:研究人员开发出大脑类器官用于研究认知障碍!
- C 语言中赋值表达式的返回的逻辑值
- ContentProvider再探——Document Provider
- java多线程启动BIO和NIO服务端同时启动接受图片和字符数据
- OpenCV calcOpticalFlowPyrLK用法的实例(附完整代码)
- MySQL分组查询—添加分组后筛选
- matlab如何求矩阵的转置矩阵,怎么用MATLAB程序求转置矩阵?急需,高手帮忙………………...
- Spring Integration Framework简介
- Laravel Session 遇到的坑
- js java 反射机制_java 类加载机制和反射机制
- 件测试专家分享III GUI自动化测试相关
- 为什么「margin:auto」可以让块级元素水平居中?
- 云物大智题库--人工智能
- 使用ResNet101作为预训练模型训练Faster-RCNN-TensorFlow-Python3-master
- Win32学习笔记 - WndProc回调函数
- [QT学习]-调色板|选择文件
- Nginx基本使用方法
- python opencv3 背景分割 mog2 knn
- 今年C++找工作这么这么难?