【解题报告】[动态规划] - PID90 / 未出现的子串

原题地址:http://www.rqnoj.cn/problem/90

解题思路:题目看起来不太像动态规划。。。

我用一个数组f[i][j]来表示在数组第i个元素的后面第一次出现j的位置,为-1则是没出现过。

然后每次查找最大的位置即可。如题目例子中:

f    1  3
 5  2  4  1  3  5  2  2  2  2
 3  4  1  5  3
 2
-----------------------------------------------------------

1  1  6  6
 6  6  6 15 15 15 15 15 15 15 15 15 -1 -1 -1 -1
2  4  4  4  4
 9  9  9  9  9 10 11 12 18 18 18 18 18 18
-1
3  2
 2  7  7  7  7  7 13 13 13 13 13 13 17 17 17 17 -1
-1
4  5
 5  5  5  5 14 14 14 14 14 14 14 14 14 -1 -1 -1 -1
-1
5  3
 3  3  8  8  8  8  8 16 16 16 16 16 16 16 16
-1 -1 -1

从第0位置开始查找,找出f[0][1]~f[0][q]中的最大值。下一次就从这个最大值的地方开始查找,直到查找到f[0][1]~f[0][q]存在-1为止。

查找的次数就是答案。

代码:

 1 #include<iostream>
2 #include<stdio.h>
3 using namespace std;
4 int s[100005];
5 int f[100005][10];
6 int n,q;
7 int main()
8 {
9 int i,j;
10 //freopen("out.txt","w",stdout);
11 scanf("%d%d",&n,&q);
12 for(i=1;i<=n;i++)
13 {
14 scanf("%d",&s[i]);
15 }
16 int fend[10];
17 for(j=1;j<=q;j++)
18 {
19 fend[j]=-1;
20 }
21 for(i=n;i>=0;i--)
22 {
23 for(j=1;j<=q;j++)
24 {
25 f[i][j]=fend[j];
26 }
27 fend[s[i]]=i;
28 }/*
29 for(j=1;j<=q;j++)
30 {
31 for(i=0;i<=n;i++)
32 {
33 printf("%3d",f[i][j]);
34 }
35 printf("\n");
36 }*/
37 int ans=1;
38 i=0;
39 int max;
40 while(1)
41 {
42 max=0;
43 for(j=1;j<=q;j++)
44 {
45 if(f[i][j]==-1) {max=-1;break;}
46 if(max<f[i][j]) max=f[i][j];
47 }
48 if(max==-1) break;
49 else
50 {
51 i=max;
52 ans++;
53 //printf("i=%d\n",i);
54 }
55 }
56 printf("%d\n",ans);
57 return 0;
58 }

【解题报告】[动态规划] - PID90 / 未出现的子串,布布扣,bubuko.com

时间: 2024-08-02 12:48:59

【解题报告】[动态规划] - PID90 / 未出现的子串的相关文章

【解题报告】[动态规划]RQNOJ PID2 / 开心的金明

原题地址:http://www.rqnoj.cn/problem/2 解题思路:背包问题. 状态转移方程:DP[i][j]=max(DP[i-v[j]][j-1]+p[j]*v[j],DP[i][j-1]) DP[i][j]表示最多话费i的钱,购买前j+1个物品所能达到的最大价值. 解题代码: 1 #include<stdio.h> 2 #include<iostream> 3 #include<algorithm> 4 using namespace std; 5 i

动态规划_leetcode312解题报告

#coding=utf-8 # leetcode 312 解题报告 20190307 找工作期间#解题思路# 假设初始气球的状态是 [3,1,5,8] #.顺向思维# 第一步有四个选择:3,1,5,8 ,# 第二步有三个选择:…… o(n!)# 每一步后 原问题的规模是减少了 ,但是数据的同质性却破坏了:# 因为原问题的数组是连续的,子问题的数组不是连续的 这破坏了数据同质性的原则. ## 所以后面的思路就是 将不连续的数组 转换为连续的数组,这样子问题和原问题# 数据结构同质,且数据规模-1,

NOIP2007解题报告

第一题:  某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*109).已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果. 解题过程: 直接sort快拍然后扫描一遍即可. 第二题:  在初赛普及组的“阅读程序写结果”的问题中,我们曾给出一个字符串展开的例子:如果在输入的字符串中,含有类似于“d-h”或“4-8”的子串,我们就把它当作一种简写,输出时,用连续递增的字母或数字串替代其中的减号,即,将上面两个子串分

【百度之星2014~初赛(第二轮)解题报告】Chess

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]Chess>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=667 前言 最近要毕业了,有半年没做

解题报告 之 POJ1226 Substrings

解题报告 之 POJ1226 Substrings Description You are given a number of case-sensitive strings of alphabetic characters, find the largest string X, such that either X, or its inverse can be found as a substring of any of the given strings. Input The first li

codeforces 505A. Mr. Kitayuta&#39;s Gift 解题报告

题目链接:http://codeforces.com/problemset/problem/505/A 题目意思:给出一个长度不大于10的小写英文字符串 s,问是否能通过在字符串的某个位置插入一个字母,使得新得到的字符串成为回文串. /**************************************(又到自我反省时刻) 做的时候,通过添加一个单位使得长度增加1,找出中点,检验前一半的位置,找出对称位置替换成对应的前一半位置的字符,然后原字符串剩下的部分追加到后面,再判断回文.但是由于

【百度之星2014~初赛(第二轮)解题报告】JZP Set

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<[百度之星2014~初赛(第二轮)解题报告]JZP Set>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=668 前言 最近要毕业了,有半年

【百度之星2014~资格赛解题报告】

声明 笔者最近意外的发现 笔者的个人网站http://tiankonguse.com/ 的很多文章被其它网站转载,但是转载时未声明文章来源或参考自 http://tiankonguse.com/ 网站,因此,笔者添加此条声明. 郑重声明:这篇记录<标题>转载自 http://tiankonguse.com/ 的这条记录:http://tiankonguse.com/record/record.php?id=666 前言 最近要毕业了,有半年没做比赛了.这次参加百度之星娱乐一下.现在写一下解题报

洛谷OJ P1032 字串变换 解题报告

洛谷OJ P1032 字串变换 解题报告 by MedalPluS   [题目描述] 已知有两个字串 A$, B$ 及一组字串变换的规则(至多6个规则): A1$ -> B1$ A2$ -> B2$ 规则的含义为:在 A$中的子串 A1$ 可以变换为 B1$.A2$ 可以变换为 B2$ …. 例如:A$='abcd' B$='xyz' 变换规则为: ‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’ 则此时,A$ 可以经过一系列的变换变为 B$,其变换的过程为: