上升子序列
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
一个只包含非负整数的序列bi,当b1 < b2 < ... < bS的时候,我们称这个序列是上升的。对于给定的一个序列{a1, a2, ...,aN},我们可以得到一些上升的子序列{ai1, ai2, ..., aiK},这里1 ≤ i1 < i2 <...< iK ≤ N。例如:对于序列{1, 7, 3, 5, 9, 4, 8},有它的一些上升子序列,如{1, 7}, {3, 4, 8}等等。这些子序列中序列和最大的是子序列{1, 3, 5, 9},它的所有元素的和为18。 对于给定的一个序列,求出它的最大上升子序列的和。
注意:最长的上升子序列的和不一定是最大的哦。
输入
输入包含多组测试数据,对于每组测试数据:
输入数据的第一行为序列的长度 n(1 ≤ n ≤ 1000),
第二行为n个非负整数 b1,b2,...,bn(0 ≤ bi ≤ 1000)。
输出
对于每组测试数据,输出其最大上升子序列的和。
示例输入
7
1 7 3 5 9 4 8
示例输出
18
1 #include<stdio.h>
2 int main()
3 {
4 int n,a[
1001],m,maxlen[
1001];
5 while(~scanf(
"%d",&
n))
6 {
7 for(
int i =
0; i < n; i++
)
8 scanf(
"%d",&
a[i]);
9 maxlen[
0] = a[
0];
10 for(
int i =
1; i < n; i++
)
11 {
12 m =
0;
13 for(
int j =
0; j < i; j++
)
14 {
15 if(a[j] < a[i] && maxlen[j] >
m)
16 m =
maxlen[j];
17 }
18 maxlen[i] = m +
a[i];
19 }
20 int maxx = -
999;
21 for(
int i =
0; i < n; i++
)
22 if(maxx <
maxlen[i])
23 maxx =
maxlen[i];
24 printf(
"%d\n",maxx);
25 }
26 return 0;
27 }
28
类似于课本上的最长上升子序列
回文时间
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
HH 每天都会熬夜写代码,然后很晚才睡觉,但是每天早晨六点多必须要刷卡出宿舍,这就导致了必须在某些课上睡一会才能保证充沛的体力,当然某些重要的课是不能睡掉的,而某些课是可以睡的,比如《中国传统文化》,但是睡觉是不能被老师发现的,否则......他会以让你重修两年来威胁你。已知老师会在电子表上显示的时间为回文(例如:15:51)的时候来检查有没有人在睡觉,所以必须要在那个时间之前醒来。现在,给出 HH 开始睡觉的时间,你要帮她计算出下一个回文时间。
输入
输入包含多组测试数据,对于每组测试数据:
输入只有一行为一个字符串,字符串格式为"HH:MM",HH 和 MM 都为两位数字(00 ≤ HH ≤ 23, 00 ≤ MM ≤ 59)。
输出
对于每组测试数据,输出只有一行为下一个回文时间。
示例输入
12:21
23:59
示例输出
13:31
00:00
1 #include<stdio.h>
2 #include<
string.h>
3 int main()
4 {
5 char s[
10];
6 int a,b,c,d;
7 while(scanf(
"%s",s)!=
EOF)
8 {
9 a = (s[
0]-
'0')*
10+(s[
1]-
'0');
10 b = (s[
1]-
'0')*
10+(s[
0]-
'0');
11 c = (s[
3]-
'0')*
10+(s[
4]-
'0');
12 if(!((a>=
6&&a<=
9)||(a>=
16&&a<=
19)))
13 {
14 if(b >
c)
15 {
16 printf(
"d:d\n",a,b);
17 continue;
18 }
19 else
20 {
21 if(a ==
23)
22 {
23 printf(
"00:00\n");
continue;
24 }
25 else
26 {
27 d = a+
1;
28 if(d>=
16&&d<=
19)
29 {printf(
"20:02\n");
continue;}
30 else if(d>=
6&&d<=
9){printf(
"10:01\n");
continue;}
31 else{ printf(
"d:d\n",d,(d%
10)*
10+(d/
10));
continue;}
32 }
33 }
34 }
35 else if(a>=
16&&a<=
19)
36 {
37 printf(
"20:02\n");
38 continue;
39 }
40 else
41 {
42 printf(
"10:01\n");
43 continue;
44 }
45 }
46 return 0;
47 }
话说这个要考虑到特殊情况比如06点、16点或23点时,开始用gets输入一直output limit,改成scanf 才过。
递归的函数
Time Limit: 1000ms Memory limit: 65536K 有疑问?点这里^_^
题目描述
给定一个函数 f(a, b, c):
如果 a ≤ 0 或 b ≤ 0 或 c ≤ 0 返回值为 1;
如果 a > 20 或 b > 20 或 c > 20 返回值为 f(20, 20, 20);
如果 a < b 并且 b < c 返回 f(a, b, c−1) + f(a, b−1, c−1) − f(a, b−1, c);
其它情况返回 f(a−1, b, c) + f(a−1, b−1, c) + f(a−1, b, c−1) − f(a-1, b-1, c-1)。
看起来简单的一个函数?你能做对吗?
输入
输入包含多组测试数据,对于每组测试数据:
输入只有一行为 3 个整数a, b, c(a, b, c < 30)。
输出
对于每组测试数据,输出函数的计算结果。
示例输入
1 1 1
2 2 2
示例输出
2
4
1 #include<stdio.h>
2 int main()
3 {
4 int f[
21][
21][
21],i,j,k;
5 for( i =
0; i <=
20; i++
)
6 for( j =
0; j <=
20; j++
)
7 for( k =
0; k <=
20; k++
)
8 {
9 if(i ==
0 || j ==
0 || k ==
0)
10 f[i][j][k] =
1;
11 else if(i < j && j <
k)
12 f[i][j][k] = f[i][j][k-
1]+f[i][j-
1][k-
1]-f[i][j-
1][k];
13 else f[i][j][k] = f[i-
1][j][k]+f[i-
1][j-
1][k]+f[i-
1][j][k-
1]-f[i-
1][j-
1][k-
1];
14 }
15 int a,b,c;
16 while(~scanf(
"%d %d %d",&a,&b,&
c))
17 {
18 if(a <=
0 || b <=
0 || c <=
0)
19 printf(
"%d\n",f[
0][
0][
0]);
20 else if(a >
20 || b >
20 || c >
20)
21 printf(
"%d\n",f[
20][
20][
20]);
22 else
23 printf(
"%d\n",f[a][b][c]);
24 }
25 return 0;
26 }
递归调用超时,直接用数组保存。
转载于:https://www.cnblogs.com/LK1994/archive/2013/05/31/3109556.html
相关资源:浙江大学《程序设计基础及实验》课程期末考试试卷