第一题:最大子数组和
题目描述
给定一个数组a[0,...,n-1],求其最大子数组(长度>=1)和
输入描述
第一行一个整数n(1<=n<=5000),然后依次输入n个整数(每个整数范围[-5000, 5000])
输出描述
输出一个整数表示最大子数组和
样例输入
5
1 -1 1 1 -1
样例输出
2
#include<stdio.h> int maxSum(int *a,int n) { int max=-1; int i,j,sum; for(i=0;i<n;i++) { sum=0; for(j=i;j<n;j++) { sum+=a[j]; if(sum>max) max=sum; } } return max; } int main(int argc,const char *argv[]) { int len; scanf("%d",&len); int i,a[len]; for(i=0;i<len;i++) scanf("%d",&a[i]); printf("%d",maxSum(a,len)); return 0; }
第二题:字符串的回文子序列个数
题目描述
求一个长度不超过15的字符串的回文子序列个数(子序列长度>=1)。
输入描述
输入一个长度不超过15的字符串,字符串均由小写字母表示
输出描述
输出其回文子序列个数
样例输入
abaa
样例输出
10
注释
本例中其所有回文子序列为:
a,b,a,a,aba,aba,aa,aa,aa,aaa
一个字符串的子序列是指在原字符串上去除某些字符但不破坏余下元素的相对位置(在前或在后)而形成的新字符串。
#include<string> #include<iostream> using namespace std; string str, creat=""; int ans=0; bool used[20]={false}; bool back_forward(string str) { for (int i=0;i<str.length()/2;i++) { if (str[i]!=str[str.length()-i-1]) return false; } return true; } void search(int len, int start) { if(len<=0) { if(back_forward(creat)) ans++; return; } for(int i = start;i<str.length();i++) { if(!used[i]) { used[i]=true; creat.append(str,i,1); search(len-1,i+1); used[i]=false; creat.erase(creat.length()-1,1); } } } int main(int argc,const char *argv[]) { cin>>str; for(int i=1;i<=str.length();i++) search(i,0); cout<<ans; return 0; }
第三题:数组第K小数
题目描述
给定一个整数数组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 <vector> #include <algorithm> #include <iostream> using namespace std; int main(int argc,const char *argv[]) { int n,k; cin >>n>>k; vector<int>a(n,0); for(int i=0;i<n;i++) { cin>>a[i]; } sort(a.begin(),a.end()); cout<<a[k-1]; return 0; }
附加题:最大子数组和(加强版)
题目描述
给定一个数组a[0,...,n-1],求其最大子数组(长度>=1)和
输入描述
第一行一个整数n(1<=n<=100000),然后依次输入n个整数(每个整数范围[-5000, 5000])
输出描述
输出一个整数表示最大子数组和
样例输入
5
1 -1 1 1 -1
样例输出
2
注释
本题和Lab 6-1相比数组长度变大,对程序的运行效率要求更加严格。
#include<stdio.h> int max(int x,int y) { return (x>y)?x:y; } int maxSum(int *a,int n) { int i; int nAll,nStart; nAll=a[n-1]; nStart=a[n-1]; for(i=n-2;i>=0;i--) { nStart=max(a[i],a[i]+nStart); nAll=max(nAll,nStart); } return nAll; } int main(int argc,const char *argv[]) { int len; scanf("%d",&len); int i,a[len]; for(i=0;i<len;i++) scanf("%d",&a[i]); printf("%d",maxSum(a,len)); return 0; }