UVA - 507 Jill Rides Again 求最长子序列和

来源:互联网 发布:博德之门2增强版 mac 编辑:程序博客网 时间:2024/06/04 19:23

题目大意:有N个站,N-1条路,每条路对应一个好感度,要求选择出一条好感度最大的路,如果好感度相同的话,输出路径最长的那条路,如果最大的好感度小于0,就输出另一个串

解体思路:本题有两种解法,一种是利用一个数组存储总好感度,如:sum[5]存储的就是从前五条路的好感度的和,这样以来的话,sum[5]-sum[3]就能得出第四条路到第五条路的好感度了,找到好感度最小的路的起点min,然后sum[i]-sum[min]就是第min到第i的好感度的

解法1:

#include<cstdio>const int maxn = 20000 + 5;int sum[maxn];int main() {int test;int num,temp,mark = 1;scanf("%d", &test);while(test--) {int num;scanf("%d", &num);sum[0] = 0;for(int i = 1; i < num; i++) {scanf("%d", &temp);sum[i] = temp + sum[i-1];}int min = 0, max = -0x3f3f3f3f,left = 0,right = 0;int t;for(int i = 1; i < num; i++) {t = sum[i] - sum[min];if(t > max) {max = t;left = min;right = i;}if(t == max) {if(min == left)right = i;else if(i - min > right - left) {left = min;right = i;}}if(sum[i] < sum[min])min = i;}if(max > 0)printf("The nicest part of route %d is between stops %d and %d\n", mark++ ,left+1 ,right+1);elseprintf("Route %d has no nice parts\n",mark++);}return 0;}

解法二:
#include<cstdio>const int maxn = 20000 + 5;int a[maxn];int main() {int test,num;scanf("%d",&test);int mark = 1;while(test--) {scanf("%d", &num);bool flag = true;for(int i = 1; i < num; i++) {scanf("%d", &a[i]);if(a[i] > 0)flag = false;}if(flag) {printf("Route %d has no nice parts\n",mark++);continue;}int begin,start,end,sum = a[1], temp = 0;begin = start = end = 1;for(int i = 1; i < num; i++) {temp = temp + a[i];if(temp < 0) {start = i + 1;temp = 0;}if( temp > sum || (temp == sum && (end - begin) < (i - start))) {begin = start;end = i;sum = temp;}}printf("The nicest part of route %d is between stops %d and %d\n",mark++, begin,end+1);}return 0;}


0 0
原创粉丝点击