亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

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

動態規劃的經典例子

2019-11-14 13:06:33
字體:
來源:轉載
供稿:網友

最長不減子序列收集最多的蘋果01背包問題問題描述問題分析代碼實現

最長不減子序列

一個序列有N個數:A[1],A[2],…,A[N],求出最長非降子序列的長度。 (講DP基本都會講到的一個問題LIS:longest increasing subsequence)

正如上面我們講的,面對這樣一個問題,我們首先要定義一個“狀態”來代表它的子問題, 并且找到它的解。注意,大部分情況下,某個狀態只與它前面出現的狀態有關, 而獨立于后面的狀態。

5,3,4,8,6,7

根據上面找到的狀態,我們可以得到:(下文的最長非降子序列都用LIS表示)

前1個數的LIS長度d(1)=1(序列:5)前2個數的LIS長度d(2)=1(序列:3;3前面沒有比3小的)前3個數的LIS長度d(3)=2(序列:3,4;4前面有個比它小的3,所以d(3)=d(2)+1)前4個數的LIS長度d(4)=3(序列:3,4,8;8前面比它小的有3個數,所以 d(4)=max{d(1),d(2),d(3)}+1=3)

狀態轉換分成為:

d(i) = max{1, d(j)+1},其中j

#include <iostream>using namespace std;int lis(int A[], int n){ int *d = new int[n]; int len = 1; for(int i=0; i<n; ++i){ d[i] = 1; for(int j=0; j<i; ++j) if(A[j]<=A[i] && d[j]+1>d[i]) d[i] = d[j] + 1; if(d[i]>len) len = d[i]; } delete[] d; return len;}int main(){ int A[] = { 5, 3, 4, 8, 6, 7 }; cout<<lis(A, 6)<<endl; return 0;}

以上是O(n2)的算法,還有O(nlogn)的實現如下:

//在非遞減序列 arr[s..e](閉區間)上二分查找第一個大于等于key的位置,如果都小于key,就返回e+1int upper_bound(int arr[], int s, int e, int key){ int mid; if (arr[e] <= key) return e + 1; while (s < e) { mid = s + (e - s) / 2; if (arr[mid] <= key) s = mid + 1; else e = mid; } return s;}int LIS(int d[], int n){ int i = 0, len = 1, *end = (int *)alloca(sizeof(int) * (n + 1)); end[1] = d[0]; //初始化:長度為1的LIS末尾為d[0] for (i = 1; i < n; i++) { int pos = upper_bound(end, 1, len, d[i]); //找到插入位置 end[pos] = d[i]; if (len < pos) //按需要更新LIS長度 len = pos; } return len;}

參考:

http://www.hawstein.com/posts/dp-novice-to-advanced.html https://www.felix021.com/blog/read.php?1587

收集最多的蘋果

平面上有N*M個格子,每個格子中放著一定數量的蘋果。你從左上角的格子開始, 每一步只能向下走或是向右走,每次走到一個格子上就把格子里的蘋果收集起來, 這樣下去,你最多能收集到多少個蘋果。

解這個問題與解其它的DP問題幾乎沒有什么兩樣。第一步找到問題的“狀態”, 第二步找到“狀態轉移方程”,然后基本上問題就解決了。

首先,我們要找到這個問題中的“狀態”是什么?我們必須注意到的一點是, 到達一個格子的方式最多只有兩種:從左邊來的(除了第一列)和從上邊來的(除了第一行)。 因此為了求出到達當前格子后最多能收集到多少個蘋果, 我們就要先去考察那些能到達當前這個格子的格子,到達它們最多能收集到多少個蘋果。 (是不是有點繞,但這句話的本質其實是DP的關鍵:欲求問題的解,先要去求子問題的解)

經過上面的分析,很容易可以得出問題的狀態和狀態轉移方程。 狀態S[i][j]表示我們走到(i, j)這個格子時,最多能收集到多少個蘋果。那么, 狀態轉移方程如下:

s[i][j]=A[i][j]+max(S[i?1][j],if i > 0;S[i][j?1],if j > 0)

其中i代表行,j代表列,下標均從0開始;A[i][j]代表格子(i, j)處的蘋果數量。

S[i][j]有兩種計算方式:1.對于每一行,從左向右計算,然后從上到下逐行處理;2. 對于每一列,從上到下計算,然后從左向右逐列處理。 這樣做的目的是為了在計算S[i][j]時,S[i-1][j]和S[i][j-1]都已經計算出來了。

偽代碼如下:

#include <iostream> using namespace std; #define MAX_N 100 #define MAX_M 100 int arr[ MAX_N ][ MAX_M ] = { 0 }; int dp[ MAX_N + 2 ][ MAX_M + 2 ] = { 0 }; int main(){ int n, m; cin>> n >> m; //輸入n*m的方格 int i, j ; for( i = 0; i < n; i++){ for( j = 0; j < m; j++) cin>> arr[ i ][ j ]; } //輸入方格中各個格子中的蘋果數量 for( i = 0; i < n; i++){ for( j = 0; j < m; j++){ dp[ i + 1 ][ j + 1 ] = dp[ i ][ j + 1] > dp[ i + 1 ][ j ] ? dp[ i ][ j + 1] + arr[ i ][ j ] : dp[ i + 1][ j ] + arr[ i ][ j ]; } } cout<<dp[i][j]<<endl; return 0; }

http://www.tuicool.com/articles/IVVvue

01背包問題

問題描述

有編號分別為a,b,c,d,e的五件物品,它們的重量分別是2,2,6,5,4,它們的價值分別是6,3,5,4,6,現在給你個承重為10的背包,如何讓背包里裝入的物品具有最大的價值總和?

問題分析

01背包的狀態轉換方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }

代碼實現

#include<stdio.h> #include<iostream> using namespace std; int table[10][100]={0}; int tableTwo[10][100]; int flag[10]={-1}; int Knapsack(int v[],int w[],int c,int n){//value weight capacity num for(int i=1;i<n+1;i++){//因為涉及到i-1的計算,所以下標從1開始 for(int j=1;j<c+1;j++){ if(j<w[i]){ table[i][j]=table[i-1][j]; //flag[i]=0; }else{ table[i][j]=max(table[i-1][j],table[i-1][j-w[i]]+v[i]); //flag[i]=table[i-1][j]>(table[i-1][j-w[i]]+v[i])?0:1; } } } return table[n][c]; } int KnapsackTwo(int v[],int w[],int c,int n){//此方法從n->1計算 。自底向上,自左向右 int jMax=min(w[n]-1,c); for(int j=0;j<jMax;j++)tableTwo[n][j]=0;//j<當前背包容量或者當前物品重量時,tableTwo[n][j]=0; for(int j=w[n];j<=c;j++)tableTwo[n][j]=v[n];//當前背包容量可以裝得下時, tableTwo[n][j]=v[n]; for(int i=n-1;i>1;i--){ jMax=min(w[i],c); for(int j=0;j<=jMax;j++)tableTwo[i][j]=tableTwo[i+1][j]; for(int j=w[i];j<=c;j++)tableTwo[i][j]=max(tableTwo[i+1][j],tableTwo[i+1][j-w[i]]+v[i]);//當前背包容量裝得下,但是要判斷其價值是否最大,確定到底裝不裝 } tableTwo[1][c]=tableTwo[2][c];//先假設1物品不裝 if(c>=w[1])tableTwo[1][c]=max(tableTwo[1][c],tableTwo[2][c-w[1]]+v[1]);//根據價值,判斷到底裝不裝 return tableTwo[1][c];//返回最優值 } void Traceback(int w[],int c,int n){//根據最優值,求最優解 for(int i=1;i<n;i++){ if(tableTwo[i][c]==tableTwo[i+1][c])flag[i]=0; else { flag[i]=1; c-=w[i]; } } flag[n]=tableTwo[n][c]?1:0; } int main(){ int weight[6]={0,2,2,6,5,4};//最低位補了0,從weight[1]開始賦值 int value[6]={0,6,3,5,4,6}; int c=10; cout<<"第一種方法->總價值最大為:"<<Knapsack(value,weight,c,5)<<endl; cout<<"第二種方法->總價值最大為:"<<KnapsackTwo(value,weight,c,5)<<endl; Traceback(weight,c,5); cout<<"最優值的解:"; for(int i=1;i<5+1;i++)cout<<flag[i]<<" "; cout<<endl; for(int i=1;i<6;i++){ for(int j=0;j<11;j++){ http://blog.csdn.net/catkint/article/details/51009680 http://blog.csdn.net/mu399/article/details/7722810


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品国产欧美一区二区五十路| 久久精品夜夜夜夜夜久久| 97视频在线观看免费高清完整版在线观看| 国产欧美一区二区白浆黑人| 久久久97精品| 国产午夜精品久久久| 国产成人精品av| 欧美精品免费播放| 日韩最新中文字幕电影免费看| 日韩电影中文字幕在线观看| 一区二区欧美亚洲| 欧美精品精品精品精品免费| 亚洲一二在线观看| 欧美成人激情视频免费观看| 欧美美女18p| 最新的欧美黄色| 国模视频一区二区三区| 欧美精品免费在线观看| 久久久久久久爱| 久久69精品久久久久久久电影好| 91极品女神在线| 亚洲白拍色综合图区| 2019中文字幕全在线观看| 国产精品久久久久久中文字| 91高清免费视频| 日韩高清电影好看的电视剧电影| 激情亚洲一区二区三区四区| 精品久久久国产| 亚洲欧美国产高清va在线播| 国产欧美亚洲精品| 中文字幕日韩综合av| 欧美视频一二三| 久久九九全国免费精品观看| 韩国三级电影久久久久久| 精品无人国产偷自产在线| 国产成人avxxxxx在线看| 亚洲精品欧美极品| 精品国内自产拍在线观看| 国产免费一区二区三区在线能观看| 97在线视频免费看| 国产精品欧美久久久| 国产精品午夜一区二区欲梦| 亚洲qvod图片区电影| 国产精品入口免费视频一| 色噜噜国产精品视频一区二区| 日韩欧美精品中文字幕| 国产丝袜视频一区| 高清视频欧美一级| 韩曰欧美视频免费观看| 久久婷婷国产麻豆91天堂| 久久九九有精品国产23| 色综合久久天天综线观看| 欧美电影在线观看| 欧美国产日韩xxxxx| 亚洲综合中文字幕在线| 2019中文字幕在线观看| 91香蕉嫩草神马影院在线观看| 91高清在线免费观看| 亚洲人a成www在线影院| 成人免费观看a| 久久久综合免费视频| 国产一区二区在线播放| 色婷婷综合成人| 欧美日韩亚洲视频| 国产香蕉精品视频一区二区三区| 91免费视频国产| 中文字幕亚洲无线码a| 日韩精品在线免费观看视频| 国产日本欧美一区二区三区在线| 欧美猛男性生活免费| 亚洲女人被黑人巨大进入al| 最近2019好看的中文字幕免费| 91精品国产九九九久久久亚洲| 日韩av在线天堂网| 欧美性视频网站| 欧美日本啪啪无遮挡网站| 国产成人久久久精品一区| 精品高清美女精品国产区| 国产精品99久久久久久久久| 欧美在线亚洲一区| 一本色道久久88亚洲综合88| 国产精品igao视频| 成人a在线观看| 亚洲精品av在线播放| 国产精品狼人色视频一区| 亚洲第一区在线| 亚洲视频欧洲视频| 97香蕉超级碰碰久久免费的优势| 91精品国产电影| 亚洲欧美日韩在线一区| 日韩欧美有码在线| 亚洲精品国产拍免费91在线| 国产日产欧美a一级在线| 欧美成人精品一区二区| 欧美激情xxxxx| 欧美巨乳美女视频| 国产噜噜噜噜久久久久久久久| 91亚洲精品久久久久久久久久久久| 蜜臀久久99精品久久久久久宅男| 欧美极品美女视频网站在线观看免费| 日韩av理论片| 国产欧美精品一区二区三区-老狼| 欧美国产极速在线| 国产午夜精品久久久| 中文字幕日韩在线播放| 国产精品99久久久久久www| 亚洲深夜福利在线| 日本aⅴ大伊香蕉精品视频| 日韩成人免费视频| 国产综合久久久久| 在线视频国产日韩| 免费av一区二区| 国产一区二区三区高清在线观看| 4438全国成人免费| 亚洲午夜色婷婷在线| 亚洲国产三级网| 亚洲全黄一级网站| 69av在线播放| 亚洲国产成人精品电影| 欧美视频13p| yw.139尤物在线精品视频| 不卡在线观看电视剧完整版| 一区二区三区视频观看| 精品国产一区二区三区久久久狼| 在线免费看av不卡| 国产精品爽爽ⅴa在线观看| 亚洲影视九九影院在线观看| 亚洲网站在线看| 久久国产精彩视频| 国产精品专区h在线观看| 亚洲第一精品久久忘忧草社区| 韩国三级日本三级少妇99| 97欧美精品一区二区三区| 亚洲成人激情图| 亚洲老板91色精品久久| 午夜精品美女自拍福到在线| 亚洲人成在线一二| 性欧美长视频免费观看不卡| 黑人巨大精品欧美一区免费视频| 国产精品久久久久久久久久东京| 欧美日本啪啪无遮挡网站| 在线播放国产精品| 成人国产精品一区二区| 伊人久久大香线蕉av一区二区| 亚洲精品二三区| 欧美伊久线香蕉线新在线| 久久久久国产视频| 亚洲视频综合网| 5278欧美一区二区三区| 国产精品日日做人人爱| 国产亚洲一区二区在线| 亚洲free嫩bbb| 欧美性69xxxx肥| 97在线看福利| 麻豆国产精品va在线观看不卡| 成人在线中文字幕| 久久人人爽人人爽人人片av高请| 国产美女搞久久| 欧美日韩国产丝袜另类| 亚洲激情第一页| 国产欧美一区二区三区久久| 亚洲一区二区久久久久久| 高清欧美性猛交xxxx黑人猛交| 日韩女优人人人人射在线视频|