FZU 2129 子序列个数

2024-01-28 06:08
文章标签 序列 个数 fzu 2129

本文主要是介绍FZU 2129 子序列个数,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

        给一个序列,里面可能有相同元素,问能组成多少不同子序列。

        DP。一直想用dp(i)表示到序列a1~ai的答案,一直想不出来,其实有更好的做法。我们可以用dp(i)表示最后一个元素为ai的子序列有多少,sum(i)表示dp(1)~dp(i)的和。状态转移见代码。

#include <stdlib.h>
#include <iostream>
#include <stdio.h>
#include <string.h>using namespace std;const int maxn = 1e6+10;
const int mod = 1e9+7;int n;
int a[maxn];
int lastpos[maxn];	//记录每个数最近出现的位置 
int dp[maxn];		//最后一个元素为ai的子序列个数 
int sum[maxn];		//前缀和 int main(){while(cin>>n){memset(lastpos,-1,sizeof(lastpos));memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++){scanf("%d",&a[i]);}dp[1]=1;sum[1]=1;lastpos[a[1]]=1;for(int i=2;i<=n;i++){dp[i]=sum[i-1];dp[i]%=mod;if(lastpos[a[i]]!=-1){	//ai曾经出现过 dp[i]-= sum[lastpos[a[i]]-1];dp[i]+=mod;dp[i]%=mod;}else{					//ai未曾出现过,可以单独成为新的子序列 dp[i]++;}sum[i]=sum[i-1]+dp[i];sum[i]%=mod;lastpos[a[i]]=i;}cout<<sum[n]<<endl;}return 0;
}


这篇关于FZU 2129 子序列个数的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/652689

相关文章

spoj705( 求不相同的子串个数)

题意:求串s的不同子串的个数 解题思路:任何子串都是某个后缀的前缀,对n个后缀排序,求某个后缀的前缀的个数,减去height[i](第i个后缀与第i-1 个后缀有相同的height[i]个前缀)。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#include<math.h>#include<cstrin

uva 10131 最长子序列

题意: 给大象的体重和智商,求体重按从大到小,智商从高到低的最长子序列,并输出路径。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <stack>#include <vect

XTU 1233 n个硬币连续m个正面个数(dp)

题面: Coins Problem Description: Duoxida buys a bottle of MaiDong from a vending machine and the machine give her n coins back. She places them in a line randomly showing head face or tail face o

POJ1631最长单调递增子序列

最长单调递增子序列 import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;publ

fzu 2277 Change 线段树

Problem 2277 Change Time Limit: 2000 mSec    Memory Limit : 262144 KB  Problem Description There is a rooted tree with n nodes, number from 1-n. Root’s number is 1.Each node has a value ai.

fzu 2275 Game KMP

Problem 2275 Game Time Limit: 1000 mSec    Memory Limit : 262144 KB  Problem Description Alice and Bob is playing a game. Each of them has a number. Alice’s number is A, and Bob’s number i

leetcode105 从前序与中序遍历序列构造二叉树

根据一棵树的前序遍历与中序遍历构造二叉树。 注意: 你可以假设树中没有重复的元素。 例如,给出 前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7] 返回如下的二叉树: 3/ \9 20/ \15 7   class Solution {public TreeNode buildTree(int[] pr

O(n)时间内对[0..n^-1]之间的n个数排序

题目 如何在O(n)时间内,对0到n^2-1之间的n个整数进行排序 思路 把整数转换为n进制再排序,每个数有两位,每位的取值范围是[0..n-1],再进行基数排序 代码 #include <iostream>#include <cmath>using namespace std;int n, radix, length_A, digit = 2;void Print(int *A,

day-50 求出最长好子序列 I

思路 二维dp,dp[i][h]表示nums[i] 结尾,且有不超过 h 个下标满足条件的最长好子序列的长度(0<=h<=k),二维数组dp初始值全为1 解题过程 状态转换方程: 1.nums[i]==nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h]+1) 2.nums[i]!=nums[j],dp[i,h]=Math.max(dp[i,h],dp[j,h-1

LeetCode:3177. 求出最长好子序列 II 哈希表+动态规划实现n*k时间复杂度

3177. 求出最长好子序列 II 题目链接 题目描述 给你一个整数数组 nums 和一个非负整数k 。如果一个整数序列 seq 满足在下标范围 [0, seq.length - 2] 中 最多只有 k 个下标i满足 seq[i] != seq[i + 1] ,那么我们称这个整数序列为好序列。请你返回 nums中好子序列的最长长度。 实例1: 输入:nums = [1,2,1,1,3],