設a【i】,dp【i】
我們在選擇乙個元素a[j]的時候,只有兩種情況,將a[i]至a[j-1]加上,或者從a[j]以j為起點開始。我們用乙個陣列dp[i]表示以i為結束的最大子段和,對於每乙個a[i],加上dp[i-1]成為子段,或以a[i]開始成為新段的起點。因為我們只需要記錄dp值,所以複雜度是o(n)。由此可得遞推公式如果不用求最大子段和的起始和終止位置,可以進行空間優化dp[i] = a[i] dp[i - 1] <0;
dp[i] = dp[i - 1] + a[i] dp[i - 1] >= 0;
dp[i ] = a[0] i == 0;
模板題51nod1049
//最大欄位和dp
//最大欄位和dp
#include
using
namespace std;
const
int maxn =
50000+7
;typedef
long
long ll;
ll arr[maxn]
;ll maxsum
(int n)
else
ans =
max(dp,ans);}
return ans;
}int
main()
ll ans =
maxsum
(n);
cout<}return0;
}
這裡給出乙個求最大欄位和以及起始和終止點位置的例題hdu 1003
用陣列dp【i】表示以i結束的最大欄位和
//最大欄位和dp
#include
#include
#define maxn 100000 + 10
#define ll long long
using
namespace std;
ll arr[maxn]
,dp[maxn]
,tend,start;
ll maxsum
(int n)
else
if(ans < dp[i])}
start = tend;
for(
int i = start -
1; i >=
0; i--
)else
}return ans;
}int
main()
ll ans =
maxsum
(n);
cout<<
"case "
<":"
' '<10)
count++;}
return0;
}
最大欄位和小結 DP
詳情可以看這裡的講解,很詳細 poj2479 模板題,即求兩個段的最大子段和 poj2479 dp i j 表示包含第i個數的前i個數劃分為j個子段和的最大值 dp i j max j 1 k include define inf 10000000 using namespace std int d...
DP 分治 最大字段
首先用分治法 include stdio.h int maxsum int a,int left,int right for i center 1 i right i sum s1 s2 if sumvoid main 然後是動態規劃方法 include stdio.h int maxsum int...
最大欄位和
include include include include include using namespace std 最大欄位和問題描述 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0,...