題目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1003php
1、題目要求ios
給出幾組整型數據,每組數據在最開始都會給出數據的數量,根據給出的數據,求這組數據中最大的連續子串的和是多少,並寫出此時子串的左、右邊界(輸出的左右邊界從1起算)數組
2、程序代碼spa
代碼思路詳見註釋code
#include<iostream> using namespace std; int main() { int counter; //計數器 int countera; //計數器a,用於統計一共有多少組數據 int counterb; //計數器b,用於統計每組數據中的數據數 int i, j; //for語句遍歷用變量 int sum; //臨時計算的各數字和 int maxsum; //數字串中的最大子串和 int left, right; //取最大子串和時的左邊界和右邊界 cin >> countera; for(counter = 1; counter <= countera; counter++) { maxsum = -1001; //依次讀入數據時,maxsum被設置爲數組中的最大值 cin >> counterb; int* array = new int[counterb]; for(i = 0; i < counterb; i++) { cin >> array[i]; if(array[i] > maxsum) { maxsum = array[i]; left = i; right = i; } } for(i = 0; i < counterb; i++) { //除了本身單獨成串的狀況(前面已經考慮過) //負數不能做爲max子串的第0項 if(array[i] < 0) { continue; } //考察從數組array第i項開始的各子串 sum = 0; for(j = i; j < counterb; j++) { sum += array[j]; //子串數字和大於maxsum的狀況下 //將maxsum與左右邊界設定爲當前狀態 if(sum > maxsum) { maxsum = sum; left = i; right = j; } //若是sum小於0,則後面的子串沒必要考察 //由於後面的串再大,加上前面小於0的sum也是累贅 //不可能再得出新的最大子串 if(sum < 0) { break; } } } //輸出計算結果 cout << "Case " << counter << ':' << endl; cout << maxsum << ' ' << left + 1 << ' ' << right + 1 << endl; if(counter != countera) { cout << endl; } } return 0; }
3、以前寫的超時代碼(窮舉法)ci
#include<iostream> using namespace std; int main() { int counter, countera, counterb; int i, j, k, sum, maxsum, left, right; //讀取數據組數 cin >> countera; for(counter = 1; counter <= countera; counter++) { //依次讀入各組數據 cin >> counterb; int* array = new int[counterb]; for(i = 0; i < counterb; i++) { cin >> array[i]; } maxsum = array[0]; //逐個子串比對 for(i = 0; i < counterb; i++) { for(j = i; j < counterb; j++) { //計算子串數字和 sum = 0; for(k = i; k <= j; k++) { sum += array[k]; } //數字和大於maxsum則更新maxsum if(sum > maxsum) { left = i; right = j; maxsum = sum; } } } cout << "Case " << counter << ':' << endl; cout << maxsum << ' ' << left + 1 << ' ' << right + 1 << endl; if(counter != countera) { cout << endl; } } return 0; }
ENDget