麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 學院 > 開發設計 > 正文

【DP入門】最大連續子串和

2019-11-14 12:52:23
字體:
來源:轉載
供稿:網友

題目來自nyist第44題,詳細如下

描述

給定一整型數列{a1,a2...,an},找出連續非空子串{ax,ax+1,...,ay},使得該子序列的和最大,其中,1<=x<=y<=n。輸入第一行是一個整數N(N<=10)表示測試數據的組數)每組測試數據的第一行是一個整數n表示序列中共有n個整數,隨后的一行里有n個整數I(-100=<I<=100),表示數列中的所有元素。(0<n<=1000000)輸出

對于每組測試數據輸出和最大的連續子串的和。

非常經典的題目,而且網上也有很多DP集錦,寫來僅僅是為了自己能夠掌握。

大意是在一個整數串中尋找有最大和值的連續子串,初次見這種題似乎不太理解要做什么,既然這道題需要用動規來解,主要是要推出狀態轉移方程,也就是遞推公式類似an=f(an-1)這樣的形式。現在從頭開始推,這里使用兩個變量all和start來作為標記,all表示總體的最大和值,start表示第i個元素作為結束值(這里,如果是從后往前 推,則是作為開始值)的最大和值,i來自于for循環。

在for循環中的第i次執行過程中,start[i] = max(start[i-1]+a[i],start[i-1]),start[i-1]相當于前i-1個數組成的序列中包含第i-1個數的最大和值,現在加入第i個數,這個start[i]要么只有他自己,要么就一定要包含第i-1個數并包含前若干個數,這若干個數在求start[i]時不可知,但是其值就是start[i-1];同時all[i] = max(all[i-1],start[i]),即總體最大和要么是上一次求出的只含i-1個數(不含第i個數)的最大和,要么就是以第i個數作為結尾(包含第i個數)的最大和值。start和all的數組形式可以省略。

代碼如下:

#include <stdio.h>int a[1000000+5]; int main(){	int all,start,max,i;	int N,n;	scanf("%d",&N);	while(N--)	{		scanf("%d",&n);		for(i=0;i<n;i++)			scanf("%d",&(a[i])); 		all = start = a[0];		for(i=1;i<n;i++)		{			start = a[i] > (a[i]+start) ? a[i] : (a[i]+start);			all = start > all ? start : all; 		} 		PRintf("%d/n",all); 	} 	return 0;} 那么為什么會想到all和start呢?不同題目有不同的具體思路,現在我還不太能解釋,這也是從他人的解題思路中見到的。留下一個坑,當我有能力的時候再回來填。這只是一道基礎題目,當時可以窺見DP的重要思想。不過要真正掌握還需要勤加練習。

靈感方法來源于http://blog.csdn.net/songuooo/article/details/7843362(侵刪),這是從后往前推的方法,我這個代碼最多算是改寫了,因為個人感覺從前往后推習慣一些。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 精品国产一区二区三区四区在线 | 92自拍视频| 亚洲精品久久久久久下一站 | 成年人国产视频 | 免费a级毛片永久免费 | 欧美成人精品一区二区 | 亚洲欧美不卡视频 | 国产一级免费不卡 | 性明星video另类hd | 午夜伦情电午夜伦情电影 | 精品国产一区三区 | 国产精品自拍av | 正在播放91| 免费国产之a视频 | 久久精品视频69 | 91网址在线播放 | 久久久电影电视剧免费看 | 久久亚洲线观看视频 | 欧美一级在线免费 | 国产合集91合集久久日 | 欧美一级毛片一级毛片 | 一级黄色免费观看 | 麻豆一二区 | 色网站免费观看 | 精品一区二区在线观看视频 | 色婷婷久久久亚洲一区二区三区 | 毛片小网站 | 欧美综合在线观看视频 | 国产一区精品在线观看 | av不卡免费在线 | 中国洗澡偷拍在线播放 | 狠狠婷婷综合久久久久久妖精 | 精品亚洲一区二区三区 | 三级xxxx| 国产精选电影免费在线观看网站 | 欧美色大成网站www永久男同 | 国产精品久久久久久久久久10秀 | gogo全球大胆高清人露出91 | 欧美精品电影一区二区 | 欧美性受xxxxxx黑人xyx性爽 | 国产精品wwww |