01-复杂度1 最大子列和问题
#include <iostream>
using namespace std;
int arr[100005];
int main()
{
int k;
cin >> k;
for (int i = 0; i < k; i++) {
cin >> arr[i];
}
int sum = 0, res = 0;
for (int i = 0; i < k; i++) {
sum += arr[i];
if (sum <= 0) sum = 0;
res = max(sum,res);
}
cout << res << endl;
return 0;
}
01-复杂度2 Maximum Subsequence Sum (25 分)
#include <iostream>
using namespace std;
int arr[100005];
int main()
{
int k;
cin >> k;
for (int i = 0; i < k; i++) {
cin >> arr[i];
}
//sum为子列和,res为最大子列和,first记录子列和的第一项,src为最大子列和的第一项,end为最大子列和的最后一项
int sum = 0, res = -1, first = 0, src = k - 1, end = k - 1;
for (int i = 0; i < k; i++) {
sum += arr[i];
if (sum > res) {
res = sum; src = first; end = i;
}
if (sum < 0) {
first = i + 1; sum = 0;
}
}
if (res < 0) cout << 0 << " " << arr[0] << " " << arr[k - 1];
else cout << res << " " << arr[src] << " " << arr[end];
return 0;
}
树的同构
#include <iostream>
using namespace std;
const int maxn = 10000000;
typedef struct BinTree {
char data;
int l, r;
}BinTree;
BinTree T1[maxn],T2[maxn];
char cl,cr;
int check[maxn];
//构建二叉树
int BuildTree(struct BinTree T[]) {
int root = -1;
int i, n; cin >> n;
if (n) {
for (i = 0; i < n; i++) check[i] = 0;
for (i = 0; i < n; i ++) {
cin >> T[i].data >> cl >> cr;
if (cl != '-') {
T[i].l = cl - '0';
check[T[i].l] = 1;
} else {
T[i].l = -1;
}
if (cr != '-') {
T[i].r = cr - '0';
check[T[i].r] = 1;
} else T[i].r = -1;
}
for (i = 0; i < n; i++) {
if (!check[i]) {
break;
}
}
root = i;
}
return root;
}
int Isomorphic(int r1, int r2) {
if (r1 == -1 && r2 == -1)
return 1;
if ((r1 == -1 && r2 != -1 ) || (r1 != -1 && r2 == -1))
return 0;
if (T1[r1].data != T2[r2].data)
return 0;
if ((T1[r1].l == -1) && (T2[r2].r== -1))
return Isomorphic(T1[r1].r,T2[r2].r);
if ((T1[r1].l != -1 && T2[r2].l != -1) && (T1[T1[r1].l].data == T2[T2[r2].l].data))
return (Isomorphic(T1[r1].l,T2[r2].l) && Isomorphic(T1[r1].r,T2[r2].r));
else
return (Isomorphic(T1[r1].l,T2[r2].r) && Isomorphic(T1[r1].r,T2[r2].l));
}
int main()
{
int r1, r2;
r1 = BuildTree(T1);
r2 = BuildTree(T2);
if (Isomorphic(r1,r2))
cout << "Yes" << endl;
else
cout << "No" << endl;
return 0;
}
03-树2 List Leaves
#include <iostream>
#include <queue>
using namespace std;
const int maxn = 1010;
const int Null = -1;
struct BinTree{
int data;
int l, r;
};
int res[maxn];
int cnt;
BinTree bt[maxn];
bool flag[maxn];
queue<BinTree> que;
void printLeaves(int root) {
que.push(bt[root]);
while(!que.empty()){
if ((que.front().l == Null) && (que.front().r == Null)) {
res[cnt++] = que.front().data;
}
if (que.front().l != Null) {
que.push(bt[que.front().l]);
}
if (que.front().r != Null) {
que.push(bt[que.front().r]);
}
que.pop();
}
}
int main()
{
int n;
cin >> n;
char cl, cr;
//use array to build tree;
for (int i = 0; i < n; i++) {
bt[i].data = i;
cin >> cl >> cr;
if (cl != '-') {
bt[i].l = cl - '0';
flag[bt[i].l] = 1;
}
else bt[i].l = Null;
if (cr != '-') {
bt[i].r = cr - '0';
flag[bt[i].r] = 1;
}
else bt[i].r = Null;
}
// find the root of the tree
int root;
for (int i = 0; i < n; i++) {
if (!flag[i]) {
root = i;
break;
}
}
//cout << root << endl;
printLeaves(root);
for (int i = 0; i < cnt; i++) {
if (i != cnt - 1)
cout << res[i] << " ";
else
cout << res[i] << endl;
}
return 0;
}