palindrome
【题目描述】
给你一个仅包含小写英文字符的回文字符串,你需要删除其中某些值使得它
变成非回文。问你最长的非回文字符串长度是多少,如果不可能输出-1.
【输入文件】
palindrom.in
第一行输入一个正整数 t 代表数据组数(1≤t≤1000)。 接下来 t 组数据每组数据输入一个回文字符串 s(1≤|s|≤50)。
【输出文件】
palindrom.out
每行输出最长的答案。
【样例输入 1】
4
abacaba
aaa
codeforcesecrofedoc
lol
【样例输出 1】
6
-1
18
2
解题思路:首先,判断输入的字符串是否每位相同,如果每位都相同,直接输出-1;否则,用
循环
每次判断它是否为
回文数(首尾相同
),如果不是,输出它的位数;如果是,就将位数减1,进入下一次循环,直到该字符串不是回文数。
#include<bits/stdc++.h>
using namespace std;
int n;
string a;
int dbtx(int t){
for(int i=0;i<t;i++,t--){
if(a[i]!=a[t-1]){
return 0;
}
}
return 1;
}
int main(){
freopen("palindrome.in","r",stdin);
freopen("palindrome.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a;
int flag=0,len=a.size();
flag=0;
for(int j=0;j<len-1;j++){
if(a[j]!=a[j+1]){
flag=1;
break;
}
}
if(flag==0){
cout<<-1<<endl;
}
else{
for(int j=0;j<a.size();j++){
if(dbtx(len)==1){
len--;
}
else{
cout<<len<<endl;
break;
}
}
}
}
}
brackets
【题目描述】
给你一个括号序列,问你最长合法子串的长度和数量
合法子串:这个子串当中左右括号匹配
【输入文件】
brackets.in
第一行输入一个字符串 s,只包含’(’和’)’。(1≤|s|≤2e5)。
【输出文件】
brackets.out
输出最长合法子串长度和数量。
【样例输入 1】
) ( ( ( ) ) ) ) ( ( )( ) )
【样例输出 1】
6 2
【样例输入 2】
))(
【样例输出 2】
0 1(没有合法子串,直接输出0,1)
解题思路:栈。题目要求是:寻找符合“()”的子串,
输出最长合法子串长度和数量。
首先定义一个栈,输入一个字符串,设最长长度变量为maxlen:
1.当为右括号“)”时,判断栈是否为空,
(1) 为空不进栈。
(2)不为空,判断栈顶下标是否为0,如果不0,状态dp+合法子串的长度。
(3)判断dp是否等于maxlen,如果等于,数量数组+1;如果等于,再判断dp是否>maxlen,如果>,maxlen=dp,并将数量数组重置为1.
2.当为左括号“(”时,进栈。
#include<bits/stdc++.h>
using namespace std;
const int N = 1000010;
int dp[N];
string s;
int main(){
freopen("brackets.in","r",stdin);
freopen("brackets.out","w",stdout);
cin >> s;
int maxlen = 0, cnt = 1;
stack<int> stk;
for(int i = 0; i < s.size(); i++){
if(s[i] == '(') stk.push(i);
else if(stk.size())
{
int t = stk.top();
stk.pop();
if(t > 0) dp[i] = dp[t - 1];
dp[i] += i - t + 1;
if(dp[i] == maxlen) cnt++;
else if(dp[i] > maxlen) maxlen = dp[i], cnt = 1;
}
}
cout << maxlen << " " << cnt << endl;
}
killing
【题目描述】
现在有 n 只怪,第 i 只怪你需要用 ui 个道具杀死他,如果杀死了有 wi 点经验,没杀死有 li 点经验。 你总共只有 x 个道具,问你最大能获得多少经验,由于今天经验五倍,所以 最终答案要乘以 5.
【输入文件】
killing.in
第一行输入两个正整数 n,x(1≤n,x≤1000)。
接下来 n 行每行三个数 li,wi,ui(0≤li,wi≤1e6,0≤ui≤1000)。
【输出文件】
killing.out
输出最多获得的经验乘 5。
【样例输入 1】
6 8
21 52 1
21 70 5
21 48 2
14 38 3
14 36 1
14 36 2
【样例输出 1】
1060
题目分析:动态规划,01背包。
#include <bits/stdc++.h>
using namespace std;
long long a[100010], b[100010], dp[100010];//i个道具获得的最大经验
long long t,n,m,sum;
int main() {
freopen("killing.in","r",stdin);
freopen("killing.out","w",stdout);
cin>>n>>m;
for (int i = 1; i <= n; i++) {
int x, y, z;
cin >> x >> y >> z;
sum+=x;
a[i]=y-x;
b[i]=z;
}
for (int i = 1; i <= n; i++){
for (int j = m; j >= b[i]; j--) {
dp[j] = max(dp[j], dp[j - b[i]] + a[i]);
}
}
cout <<(dp[m]+sum)*5 << endl;
return 0;
}