程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> HDU(1003)動態規劃

HDU(1003)動態規劃

編輯:C++入門知識

這道題雖然有很多種解法,但我一直嘗試著用動態規劃解,剛入門,用起來很不順手,其中出現了很多錯誤,很多的意想不到,希望通過這道題,對動態規劃能夠更進一步的了解。

這道題是典型的也是動態規劃中最簡單的一道題,求最大子串和的問題。

第一步:分解出子問題。

本題的子問題是:dp[i] 代表前i個數中最大子串的和 ;

第二步:通過遞歸或遞推求出子問題的最優解。

本題中的狀態轉移方程為:if ( dp[i-1] < 0 ) dp[i] = a[i] ;

else dp[i] = dp[i-1] + a[i] ;


#include
#include
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 "<
中間還是跪了好幾次,數組開的太小了,無語……下次記得數組開大一點,多開一點,又不要錢……

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved