一看题集是太平洋西北地区的比赛题,还想着比赛题怎么会分到div.2里,后来才发现正规比赛都分div12。。 大部分还是简单题,难度不太大
Alphabet
A string of lowercase letters is called alphabetical if deleting zero or more of its letters can result in the alphabet string “abcdefghijklmnopqrstuvwxyz”.
Given a string s, determine the minimum number of letters to insert anywhere in the string to make it alphabetical.
Input
The input consists of a single line containing the string s (1 ≤ |s| ≤ 50).
It is guaranteed that s consists of lowercase ASCII letters ‘a’ to ‘z’ only.
Output
Print, on a single line, a single integer indicating the minimum number of letters that must be inserted in order to make the string s alphabetical.
Sample Input Sample Output
xyzabcdefghijklmnopqrstuvw 3
Sample Input Sample Output
aiemckgobjfndlhp 20
解题思路 典型dp题,刚开始方程已经推出来了但是演算的时候算错了数浪费了很长时间。
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <stdio.h>
#include <cstring>
#include <set>
#include <string>
using namespace std;
int main()
{
char s[100];
int dp[100];
int l,Max=1;
for(int i=0;i<100;i++)
dp[i]=1;
fgets(s,100,stdin);
l=strlen(s);
for(int i=0; i<l-1; i++)
{
for(int j=0;j<i;j++)
{
if(s[j]<s[i])
dp[i]=max(dp[i],dp[j]+1);
}
if(dp[i]>Max)
Max=dp[i];
}
cout<<26-Max<<endl;
return 0;
}
Zigzag
Your Ph.D. thesis on properties of integer sequences is coming along nicely. Each chapter is on a
different type of sequence. The first covers arithmetic sequences. Subsequently you cover binomial
sequences, computable sequences, decreasing sequences, and so on. You have one more chapter to
write, on zigzagging sequences.
A sequence is zigzagging if adjacent elements alternate between strictly increasing and strictly
decreasing. The first pair of numbers can be either strictly increasing or strictly decreasing.
For a given sequence, find the length of its longest zigzagging subsequence.
Input
The first line of input contains a single integer n (1 ≤ n ≤ 50), the length of the sequence.
The second line contains n space-separated integers, describing the sequence.
Every number in the sequence is guaranteed to be between 1 and 50, inclusive.
Output
Print, on a single line, the length of a longest zigzagging subsequence of the input sequence.
Sample Input Sample Output
5 4
2 1 3 4 2
解题思路 同是一道dp题,找出序列中最大的曲折子序列,与上题类似,可以开一个二维dp数组,分别表示一个数在上和下两种状态的dp值,分情况计算即可。
#include <algorithm>
#include <iostream>
#include <string.h>
#include <math.h>
#include <queue>
#include <stdio.h>
#include <cstring>
#include <set>
#include <string>
using namespace std;
int main()
{
int a[100];
int dp[100][2];
int n,Max=1;
cin>>n;
for(int i=0; i<n; i++)
{
cin>>a[i];
dp[i][0]=dp[i][1]=1;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(a[j]>a[i])
dp[i][0]=max(dp[i][0],dp[j][1]+1);
else if(a[j]<a[i])
dp[i][1]=max(dp[i][1],dp[j][0]+1);
}
Max=max(Max,max(dp[i][0],dp[i][1]));
}
cout<<Max<<endl;
return 0;
}