זה יותר כרוך בשמירת הסכום המקסימאלי עד המקום הנוכחי שנגמר בדיוק מקום הנוכחי (וגם איפה הוא מתחיל ומה אורכו), שמירת הסכום המקסימאלי עד המקום הנוכחי שנגמר לפני המקום הנוכחי (וגם כאן, איפה הוא מתחיל ומה אורכו), וקידום הפויינטר על גבי המערך
נניח ויש לי מערך בעל N איברים בשם A. אנו נסתכל על תת המערך שמכיל את כל האיברים מהראשון עד האיבר במקום ה-i, נקרא לו Ai. נחלק את תת הסדרה המקסימאלית במערך Ai לשני מקרים: 1) סדרה שמסתיימת לפני האיבר ה-i. נסמן את סכומה ב-before a. 2) סדרה שמסתיימת בדיוק באיבר ה-i. נסמן את סכומה ב-exact a. סדרה בעלת סכום מקסימאלי שמסתיימת לפני האיבר ה-i היא אחת מהשתיים: 1) סדרה בעלת אורך מקסימאלי שמסתיימת לפני האיבר ה-i-1 או 2) סדרה בעלת אורך מקסימאלי שמסתיימת בדיוק באיבר ה-i-1 מכאן נובעת המקסנה:
before = max{before[i-1],exact[i-1]}
סדרה בעלת סכום מקסימאלי שמסתיימת בדיוק באיבר ה-i תהיה בעלת הסכום הכי גדול שמסתיים בדיוק באיבר ה-i-1 ועוד האיבר במקום ה-i, או הסדרה הריקה. ולכן:
exact = max{0,exact[i-1]+A}
(גם הסדרה הריקה נכללת) צריך לתת גם תנאי התחלה:
before[0] = 0 exact[0] = A[0]
אם מבינים את אופן הפעולה של האלגוריתם זאת לא ממש בעיה לממש אותו בשפת C וגם להוסיף לו שישמור גם איפה מתחילה ומסתיימת כל סדרה. כמובן גם אפשר לעשות אופטימיזציה קטנה ובמקום לממש את before ואת exact בתור מערכים אפשר לממש אותם באמצעות כמות קבועה של משתנים, מפני שעבור כל מערך אנחנו לא צריכים את כל המערך, אלא רק את האיבר אליו אנחנו עושים את ההשמה, ואת האיבר לפניו.
1. לפי הסטנדרט ANSI-C גודלו של INT מובטח להיות לפחות 16 ביטים. זה אומר שגודלו האמיתי תלוי במימוש, אבל מובטח לך שהוא לא יהיה מתחת ל-16 ביט. בקשר לשאלה 2 - אין לי מושג. תנסה