題目傳送門
題意:求mcs(最大連續子串行和)及兩個端點
分析:第一種辦法:dp[i] = max (dp[i-1] + a[i], a[i]) 可以不開陣列,用乙個sum表示前i個數字的mcs,其實是一樣的。。。類似dp的做法有個名字叫聯機演算法。
第二種辦法:乙個字首記錄前i個數字的和,那麼ans = sum - mn; mn表示前j個和且和最小
兩種辦法都是o (n) 1003就這麼難?? 推薦學習資料:六種姿勢拿下連續子串行最大和問題最大子串行和問題
收穫:mcs問題的兩種o (n) 的演算法,且還有遞迴的解法 o (nlogn)
**1:
#include #include #include using namespace std;const int n = 1e6 + 10;
const int inf = 0x3f3f3f3f;
int a[n];
//o (n)
void mcs(int n)
else sum += a[i];
if (sum > mx)
} printf ("%d %d %d\n", mx, ll, rr);
}int main(void)
return 0;
}
**2:
//o (n) //anothervoid mcs(int n)
if (sum < mn)
} printf ("%d %d %d\n", mx, ll + 1, rr);
}
HDOJ 1003 最大子串行和
最開始題目都沒看懂,看了別人的部落格才知道這道題是要求最大子串行和。這裡我先歸納了三種求解最大子串行和問題的演算法,在最後給出該題的ac 直接遍歷所有可能的情況。int maxsubsequence1 int arr,int n return max sum 若將乙個序列從中分為兩半的話,該序列的和...
hdu1003最大子串行和
看了一些別人的題解,說實話,我現在還不會證明這個,我不知道為什麼這樣是最大值 hdu1003最大連續子串行和 sum i sum i 1 0 sum i 1 a i a i 只有當sum處於增長狀態時才會得到最大子串行 當sum處於減小狀態時,應當更新起點 include using namespa...
HDU1003 最大子串行和
大學搞過兩年的acm,今天心血來潮的去杭電oj上瀏覽了一下,真幸運賬號居然沒有記錯。然後想著之前學過很多經典的演算法,但是很遺憾當時沒有記錄下來,所以現在彌補遺憾的時候到了,演算法會不定期更新。include int array 100005 n void maxsubsum1 void maxsu...