这道题虽然有很多种解法,但我一直尝试着用动态规划解,刚入门,用起来很不顺手,其中出现了很多错误,很多的意想不到,希望通过这道题,对动态规划能够更进一步的了解。
这道题是典型的也是动态规划中最简单的一道题,求最大子串和的问题。
第一步:分解出子问题。
本题的子问题是:dp[i] 代表前i个数中最大子串的和 ;
第二步:通过递归或递推求出子问题的最优解。
本题中的状态转移方程为:if ( dp[i-1] < 0 ) dp[i] = a[i] ;
else dp[i] = dp[i-1] + a[i] ;
#include<iostream>
#include<stdio.h>
using namespace std ;
int main() {
int n ;
cin >> n ;
int t = 1 ;
while(n--) {
int a[110000] , dp[110000] ;
int m ;
cin >> m ;
for(int i = 0 ; i < m ; i++)
cin >> a[i] ;
dp[0] = a[0] ;
for(int j = 1 ; j < m ; j++) {
if(dp[j-1] < 0)
dp[j] = a[j] ;
else
dp[j] = dp[j-1]+a[j] ;
}
int max = dp[0] ;
int y = 0 ;
for(int k = 1 ; k < m ; k++)
if(dp[k] > max) {
max = dp[k] ;
y = k ;
}
int s = 0 ;
int x = y ;
for( int l = y ; l >= 0 ; l-- ) {
s += a[l] ;
if( s == max ) {
x = l ;
}
}
cout<<"Case "<<t++<<":"<<endl<<max<<" "<<x+1<<" "<<y+1<<endl;
if(n) cout<<endl;
}
return 0 ;
}
原文:http://blog.csdn.net/ding_hai_long/article/details/20608783