线性dp-计数类题目9(斐波那契字符串)

题目链接

解题思路

题目中的字符串有0和1组成,要构成逆序对,1要在0前面。

根据题意:

  • S 1 = 0 S1=0 S1=0
  • S 2 = 0 S2=0 S2=0
  • 对于任意正整数 n ( n ≥ 3 ) , S n = S n − 2 + S n − 1 n(n≥3),Sn=Sn−2+Sn−1 n(n≥3),Sn=Sn−2+Sn−1(" + + +"表示字符串拼接)。

如果我们知道 S n − 2 Sn-2 Sn−2和 S n − 1 Sn-1 Sn−1中的分别有多少个逆序对,有知道 S n − 2 Sn-2 Sn−2中有多少个1, S n − 1 Sn-1 Sn−1中有多少个0,那么我们就可以知道 S n Sn Sn中有多少个逆序对。

于是我们定义 d p i 0 dpi0 dpi0表示 S i Si Si中0的个数, d p i 1 dpi1 dpi1表示 S i Si Si中1的个数。再定义 f i fi fi为 S i Si Si的逆序对个数,我们可以得到以下状态转移方程:

i = 1 , d p i 0 = 1 , d p i 1 = 0 , f i = 0 i=1,dpi0=1,dpi1=0,fi=0 i=1,dpi0=1,dpi1=0,fi=0

i = 2 , d p i 0 = 0 , d p i 1 = 1 , f i = 0 i=2,dpi0=0,dpi1=1,fi=0 i=2,dpi0=0,dpi1=1,fi=0

i > = 3 时 , d p i 0 = d p i − 2 0 + d p i − 1 0 , d p i 1 = d p i − 2 1 + d p i − 1 1 , f i = f i − 2 + f i − 1 + d p i − 2 1 ∗ d p i − 1 0 . i>=3时,dpi0=dpi-20+dpi-10,dpi1=dpi-21+dpi-11,fi=fi-2+fi-1+dpi-21*dpi-10. i>=3时,dpi0=dpi−20+dpi−10,dpi1=dpi−21+dpi−11,fi=fi−2+fi−1+dpi−21∗dpi−10.

(注意:要对结果取模)

AC代码

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1e9 + 7, maxn = 1e5 + 5;
int t, dp[maxn][2], f[maxn], n;
void init() {
	dp[1][0] = 1;
	dp[2][1] = 1;
	for (int i = 3; i <= 100000; i++) {
		dp[i][0] = (dp[i - 1][0] + dp[i - 2][0]) % mod;
		dp[i][1] = (dp[i - 1][1] + dp[i - 2][1]) % mod;
		f[i] = (dp[i - 1][0] * dp[i - 2][1] % mod + f[i - 1] + f[i - 2]) % mod;
	}
}
signed main() {
	cin >> t;
	init();
	while (t--) {
		cin >> n;
		cout << f[n] << endl;
	}
	return 0;
}
相关推荐
小O的算法实验室17 小时前
IEEE TASE,基于MPC的多无人机协同搜索竞争群体优化方法
算法
Tbisnic18 小时前
BGE-M3 算法详解:从模型架构到三种检索方式的数学原理
算法·自然语言处理·大模型·bert·transformer·注意力机制
Brilliantwxx18 小时前
【算法从零到千】【55-58】哈希位图+常见数学运算 接口
算法
空堂与归19 小时前
用户分群找不到规律?用K-Means聚类算法自动发现数据模式
算法·机器学习·kmeans·聚类
动词ing20 小时前
【C语言】自定义函数+指针入门
c语言·开发语言·算法
重生之后端学习20 小时前
283. 移动零[简单]✅
开发语言·数据结构·算法·leetcode·职场和发展
一只小小的芙厨20 小时前
基础数论总结
笔记·学习·算法
夜不会漫长1 天前
C++入门(1)
开发语言·c++·算法
wen_zhufeng1 天前
IndexTTS 2.5 技术报告
人工智能·算法·机器学习
大熊背1 天前
树莓派相机自动白平衡详解(四)
算法·树莓派·白平衡·isppipeline