C6-1 最大子数组和
(100/100 分数)
题目描述
给定一个数组a[0,...,n-1],求其最大子数组(长度>=1)和
输入描述
第一行一个整数n(1<=n<=5000),然后依次输入n个整数(每个整数范围[-5000, 5000])
输出描述
输出一个整数表示最大子数组和
样例输入
5
1 -1 1 1 -1
样例输出
2
#include <iostream>
using namespace std;
int main() {
int max;
int n,i,x;
int sum;
cin >> n; //键盘输入数组长度
cin >> x; //键盘输入第一个数
max = x; sum = x;
for (i = 1; i < n; ++i) {
cin >> x;
if (max < x)
max = x;
sum += x;
if (max < sum)
max = sum;
if (sum < 0)
sum = 0; //和小于0则置0
}
cout << max<< endl;
return 0;
}
C6-2 字符串的回文子序列个数
(100/100 分数)
题目描述
求一个长度不超过15的字符串的回文子序列个数(子序列长度>=1)。
输入描述
输入一个长度不超过15的字符串,字符串均由小写字母表示
输出描述
输出其回文子序列个数
样例输入
abaa
样例输出
10
注释
本例中其所有回文子序列为:
a,b,a,a,aba,aba,aa,aa,aa,aaa
一个字符串的子序列是指在原字符串上去除某些字符但不破坏余下元素的相对位置(在前或在后)而形成的新字符串。
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
string s, s1;
int len;
cin >> s;
len = s.length();
vector<vector<int>> a(len, vector<int>(len));
for (int j = 0; j < len; ++j) {
a[j][j] = 1;
for (int i = j - 1; i >= 0; --i) {
a[i][j] = a[i + 1][j] + a[i][j - 1] - a[i + 1][j - 1];
if (s[i] == s[j])
a[i][j] += 1 + a[i + 1][j - 1];
}
}
cout << a[0][len - 1]<<endl;
return 0;
}
C6-3 数组第K小数
(100/100 分数)
题目描述
给定一个整数数组a[0,...,n-1],求数组中第k小数
输入描述
首先输入数组长度n和k,其中1<=n<=5000, 1<=k<=n
然后输出n个整形元素,每个数的范围[1, 5000]
输出描述
该数组中第k小数
样例输入
4 2
1 2 3 4
样例输出
2
#include <iostream>
using namespace std;
int main() {
int n,k;
int a[5000];
int tmp;
cin >> n >> k;
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
for (int i = 0; i < n; i++) {
for (int j = n - 1; j > 0; j--) {
if (a[j - 1] > a[j]) {
tmp = a[j];
a[j] = a[j - 1];
a[j - 1] = tmp;
}
}
}
cout << a[k-1] << endl;
return 0;
}