线性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;
}
相关推荐
水母量化3 分钟前
量化收益率计算别混用:算术均值、几何均值与对数收益
算法·均值算法·量化交易
xunberg35 分钟前
【生命科学 Agent】推理平台(三)
算法·程序员·架构
INGNIGHT35 分钟前
151 · 买卖股票的最佳时机 III(序列dp)
数据结构·算法·leetcode
庖丁解牛39 分钟前
十进制转二进制:凑数法(填1法)
算法
行者全栈架构师1 小时前
【共创稿事节】双引擎智能相册:HarmonyOS 7(API 26)文搜图 × 图像超分端侧 AI 联动实战
前端·算法·架构
小蒋观天下1 小时前
【无标题】红外补光近距过曝、远距欠曝:导致车牌AI识别失效调试
人工智能·深度学习·数码相机·算法·机器学习·ai大模型
吞下星星的少年·-·2 小时前
牛客周赛 119B题(贪心)
算法·贪心
NEFU_Jyj2 小时前
牛客周赛R166(max型瓶颈最短路,前后缀DP合并)
算法·深度优先
Tisfy3 小时前
LeetCode 3644.排序排列:不对则与(脑筋急转弯)
数据结构·算法·leetcode·题解·位运算
lisw054 小时前
分岔论揭示演化突变密码
开发语言·算法·数学建模