Maximum Subsequence Sum【PAT 1007題】---簡單的動態規划


題目鏈接:http://pat.zju.edu.cn/contests/pat-practise/1007

最大連續子序列和,動態規划的簡單題,其實這個題不用動態規划的方法去理解算法也很簡單,用sum存儲遍歷途中遇到的當前最大和,用temp存儲當前處理的子序列和,如果temp>=0,則訪問a[i]時,temp += a[i],但若temp是小於0的,則加上a[i]以后定然小於a[i],所以直接把temp更新為a[i],訪問一個新的子序列,如果temp大於sum,則更新sum,以上就是解題思路,由於題目中要求求出最大和的同時,記錄下相應子序列的首尾元素值,若序列全是負數,則最大和定義為0,首尾定義為整個序列的首尾值,所以程序中需要增加一些變量以存儲以上信息.

 

 1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main()
5 {
6 int k;
7 int *data;
8 int i;
9
10 int start, end, sum, temp, tempi, tempj;
11
12 while(scanf("%d", &k) != EOF)
13 {
14 data = (int *)malloc(k * sizeof(int));
15 for(i = 0; i < k; i ++)
16 {
17 scanf("%d", &data[i]);
18 }
19 sum = 0;
20 start = 0;
21 end = k - 1;
22 temp = 0;
23 tempi = 0;
24 tempj = 0;
25 for(i = 0; i < k; i ++)
26 {
27 if(temp >= 0)
28 {
29 temp += data[i];
30 tempj = i;
31 }
32 else
33 {
34 temp = data[i];
35 tempi = i;
36 tempj = i;
37 }
38 if(temp > sum || (temp == 0 && end == k - 1))//temp確實比sum大, 或者, sum依然是初始狀態(end == k-1即表示)而且temp==0, 需要替換
39 {
40 sum = temp;
41 start = tempi;
42 end = tempj;
43 }
44 }
45 printf("%d %d %d\n", sum, data[start], data[end]);
46 }
47 return 0;
48 }




免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM