青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

專注于c++

  C++博客 :: 首頁 :: 聯系 :: 聚合  :: 管理
  21 Posts :: 0 Stories :: 4 Comments :: 0 Trackbacks

常用鏈接

留言簿(15)

我參與的團隊

搜索

  •  

最新評論

閱讀排行榜

評論排行榜

最優化原理
   1951年美國數學家R.Bellman等人,根據一類多階段問題的特點,把多階段決策問題變換為一系列互相聯系的單階段問題,然后逐個加以解決。一些靜態模型,只要人為地引進“時間”因素,分成時段,就可以轉化成多階段的動態模型,用動態規劃方法去處理。與此同時,他提出了解決這類問題的“最優化原理”(Principle of optimality):
    “一個過程的最優決策具有這樣的性質:即無論其初始狀態和初始決策如何,其今后諸策略對以第一個決策所形成的狀態作為初始狀態的過程而言,必須構成最優策略”。簡言之,一個最優策略的子策略,對于它的初態和終態而言也必是最優的。
    這個“最優化原理”如果用數學化一點的語言來描述的話,就是:假設為了解決某一優化問題,需要依次作出n個決策D1,D2,…,Dn,如若這個決策序列是最優的,對于任何一個整數k,1 < k < n,不論前面k個決策是怎樣的,以后的最優決策只取決于由前面決策所確定的當前狀態,即以后的決策Dk+1,Dk+2,…,Dn也是最優的。
    最優化原理是動態規劃的基礎。任何一個問題,如果失去了這個最優化原理的支持,就不可能用動態規劃方法計算。能采用動態規劃求解的問題都需要滿足一定的條件:
    (1) 問題中的狀態必須滿足最優化原理;
    (2) 問題中的狀態必須滿足無后效性。
    所謂的無后效性是指:“下一時刻的狀態只與當前狀態有關,而和當前狀態之前的狀態無關,當前的狀態是對以往決策的總結”。

問題求解模式
    動態規劃所處理的問題是一個多階段決策問題,一般由初始狀態開始,通過對中間階段決策的選擇,達到結束狀態。這些決策形成了一個決策序列,同時確定了完成整個過程的一條活動路線(通常是求最優的活動路線)。如圖所示。動態規劃的設計都有著一定的模式,一般要經歷以下幾個步驟。

   初始狀態→│決策1│→│決策2│→…→│決策n│→結束狀態
     圖1 動態規劃決策過程示意圖

    (1)劃分階段:按照問題的時間或空間特征,把問題分為若干個階段。在劃分階段時,注意劃分后的階段一定要是有序的或者是可排序的,否則問題就無法求解。
    (2)確定狀態和狀態變量:將問題發展到各個階段時所處于的各種客觀情況用不同的狀態表示出來。當然,狀態的選擇要滿足無后效性。
    (3)確定決策并寫出狀態轉移方程:因為決策和狀態轉移有著天然的聯系,狀態轉移就是根據上一階段的狀態和決策來導出本階段的狀態。所以如果確定了決策,狀態轉移方程也就可寫出。但事實上常常是反過來做,根據相鄰兩段各狀態之間的關系來確定決策。
    (4)尋找邊界條件:給出的狀態轉移方程是一個遞推式,需要一個遞推的終止條件或邊界條件。

算法實現
    動態規劃的主要難點在于理論上的設計,也就是上面4個步驟的確定,一旦設計完成,實現部分就會非常簡單。使用動態規劃求解問題,最重要的就是確定動態規劃三要素:問題的階段,每個階段的狀態以及從前一個階段轉化到后一個階段之間的遞推關系。遞推關系必須是從次小的問題開始到較大的問題之間的轉化,從這個角度來說,動態規劃往往可以用遞歸程序來實現,不過因為遞推可以充分利用前面保存的子問題的解來減少重復計算,所以對于大規模問題來說,有遞歸不可比擬的優勢,這也是動態規劃算法的核心之處。確定了動態規劃的這三要素,整個求解過程就可以用一個最優決策表來描述,最優決策表是一個二維表,其中行表示決策的階段,列表示問題狀態,表格需要填寫的數據一般對應此問題的在某個階段某個狀態下的最優值(如最短路徑,最長公共子序列,最大價值等),填表的過程就是根據遞推關系,從1行1列開始,以行或者列優先的順序,依次填寫表格,最后根據整個表格的數據通過簡單的取舍或者運算求得問題的最優解。下面分別以求解最大化投資回報問題和最長公共子序列問題為例闡述用動態規劃算法求解問題的一般思路。

1. 最大化投資回報問題:某人有一定的資金用來購買不同面額的債卷,不同面額債卷的年收益是不同的,求給定資金,年限以及債卷面額、收益的情況下怎樣購買才能使此人獲得最大投資回報。
    程序輸入約定:第一行第一列表示資金(1000的倍數)總量,第二列表示投資年限;第二行表示債卷面額總數;從第三行開始每行表示一種債卷,占用兩列,前一列表示債卷面額,后一列表示其年收益,如下輸入實例,
10000 1
2
4000 400
3000 250
程序實現如下,注釋幾乎說明了一切,所以不再另外分析。
/// 此數組是算法的關鍵存儲結構,用來存儲不同階段各種債卷
/// 組合下對應可獲取的最大利息。
int saifa[80005];

/// 此函數用于計算當前債卷在不同購買額下的最優利息情況,
/// 注意此時的利息情況是基于上一次債卷的情況下計算得到的,
/// 也就是說當前利息最優是基于上一次利息最優的基礎上計算出來的,
/// 這也正好體現了動態規劃中“最優化原則”:不管前面的策略如何,
/// 此后的決策必須是基于當前狀態(由上一次決策產生)的最優決策。
/*
    動態規劃的求解過程一般都可以用一個最優決策表來描述,
    對于本程序,以示例輸入為例,對于第一年,其最優決策表如下:
    0 1 2 3   4   5   6   7   8   9   10(*1000)  -- (1)
    0 0 0 0   400 400 400 400 800 800 800        -- (2)
    0 0 0 250 400 400 500 650 800 900 900        -- (3)
    (1) -- 表示首先選利息為400的債卷在對應資金下的最優利息。
    (2) -- 表示可用來購買債卷的資金。
    (3) -- 表示在已有狀態下再選擇利息為300的債卷在對應資金下的最優利息。
    注意上面表格,在求購買利息為300的債卷獲得的最優收益的時候,
    參考了以前的最優狀態,以3行8列的650為例,7(*1000)可以
    在以前購買了0張4000的債卷的基礎上再2張3000的,也可以在以前購
    買了1張4000的基礎上再買1張3000,經比較取其收益大的,這就是典
    型的動態規劃中的當前最優狀態計算。
    本程序中把上面的最優決策二維表用一個一維數組表示,值得借鑒。
*/
void add(int a,int b)
{ cout << a << " " << b << endl; // for debug
 for(int i=0;i<=80000;i++)
 {
  if(i+a > 80000)
  {
   break;
  }

  if(saifa[i]+b > saifa[i+a]) // 累計同時購買多種債卷時的利息
  {
   saifa[i+a] = saifa[i] + b;
  }

  if(i<200) // for debug
   cout << i << "-" << saifa[i] << " ";
 }
 cout << endl; // for debug
}

int main(void)
{
 int n,d,money,year,pay,bond;
 int ii,i;

 scanf("%d",&n);
 for(ii=0;ii<n;ii++)
 {
  memset(saifa,0,sizeof(saifa));
  scanf("%d%d",&money,&year);
  scanf("%d",&d);

  for(i=0;i<d;i++)
  {
   scanf("%d%d",&pay,&bond);
   add(pay/1000,bond);
  }

  // 計算指定年限內最優組合的本金利息總額
  for(i=0;i<year;i++)
  { cout << saifa[money/1000] << " "; // for debug
   money += saifa[money/1000];
  }
  cout << endl; // for debug

  printf("%d\n",money);
 }

 return 0;
}
上述程序實現方法同樣適合于背包問題,最優庫存問題等,只是針對具體情況,最優決策表的表示和生成會有所不同。

2. 最長公共子串問題:一個給定序列的子序列是在該序列中刪去若干元素后得到的序列。給定兩個序列X和Y,當另一序列Z既是X的子序列又是Y的子序列時,稱Z是序列X和Y的公共子序列。最長公共子串就是求給定兩個序列的一個最長公共子序列。例如,X=“ABCBDAB”,Y=“BCDB”是X的一個子序列。
問題分析:
    給定兩個序列A和B,稱序列Z是A和B的公共子序列,是指Z同是A和B的子序列。問題要求已知兩序列A和B的最長公共子序列。如采用列舉A的所有子序列,并一一檢查其是否又是B的子序列,并隨時記錄所發現的子序列,最終求出最長公共子序列。這種方法因耗時太多而不可取。
    考慮最長公共子序列問題如何分解成子問題,設A=“a0,a1,…,am-1”,B=“b0,b1,…,bm-1”,并Z=“z0,z1,…,zk-1”為它們的最長公共子序列。不難證明有以下性質:
(1) 如果am-1=bn-1,則zk-1=am-1=bn-1,且“z0,z1,…,zk-2”是“a0,a1,…,am-2”和“b0,b1,…,bn-2”的一個最長公共子序列;
(2) 如果am-1!=bn-1,則若zk-1!=am-1,蘊涵“z0,z1,…,zk-1”是“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一個最長公共子序列;
(3) 如果am-1!=bn-1,則若zk-1!=bn-1,蘊涵“z0,z1,…,zk-1”是“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一個最長公共子序列。
這樣,在找A和B的公共子序列時,如有am-1=bn-1,則進一步解決一個子問題,找“a0,a1,…,am-2”和“b0,b1,…,bm-2”的一個 最長公共子序列;如果am-1!=bn-1,則要解決兩個子問題,找出“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一個最長公共子序列 和找出“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一個最長公共子序列,再取兩者中較長者作為A和B的最長公共子序列。
    為了節約重復求相同子問題的時間,引入一個數組,不管它們是否對最終解有用,把所有子問題的解存于該數組中,這就是動態規劃法所采用的基本方法,具體說明如下。
定義c[i][j]為序列“a0,a1,…,ai-2”和“b0,b1,…,bj-1”的最長公共子序列的長度,計算c[i][j]可遞歸地表述如下:
(1)c[i][j] = 0                         如果i=0或j=0;
(2)c[i][j] = c[i-1][j-1]+1             如果i,j>0,且a[i-1] = b[j-1];
(3)c[i][j] = max{c[i][j-1], c[i-1][j]} 如果i,j>0,且a[i-1] != b[j-1]。
按此算式可寫出計算兩個序列的最長公共子序列的長度函數。由于c[i][j]的產生僅依賴于c[i-1][j-1]、c[i-1][j]和c[i][j-1],故可以從c[m][n]開始,跟蹤c[i][j]的產生過程,逆向構造出最長公共子序列。細節見程序。


#include <stdio.h>
#include <string.h>

#define N 100

char a[N], b[N], str[N];
int c[N][N];

int lcs_len(char* a, char* b, int c[][N])
{
    int m = strlen(a), n = strlen(b), i, j;

    for( i=0; i<=m; i++ )    
        c[i][0]=0;
    for( i=0; i<=n; i++ )    
        c[0][i]=0;

    for( i=1; i<=m; i++ ) 
    {
        for( j=1; j<=n; j++ )
        {
            if (a[i-1]==b[j-1])
                c[i][j]=c[i-1][j-1]+1;
            else if (c[i-1][j]>=c[i][j-1])
                c[i][j]=c[i-1][j];
            else
                c[i][j]=c[i][j-1];
        }
    }

    return c[m][n];
}

char* build_lcs(char s[], char* a, char* b)
{
    int i = strlen(a), j = strlen(b);
    int k = lcs_len(a,b,c);
    s[k] = '\0';
    while( k>0 )
    {
        if (c[i][j]==c[i-1][j]) 
            i--;
        else if (c[i][j]==c[i][j-1]) 
            j--;
        else
        {
            s[--k]=a[i-1];
            i--; j--;
        }
    }

    return s;
}

void main()

    printf("Enter two string (length < %d) :\n",N);
    scanf("%s%s",a,b);
    printf("LCS=%s\n",build_lcs(str,a,b));
}

posted on 2009-10-04 13:13 bellgrade 閱讀(1015) 評論(0)  編輯 收藏 引用 所屬分類: 數據結構算法
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            日韩视频免费在线| 免费看黄裸体一级大秀欧美| 久久久久久久久蜜桃| 欧美一区二区日韩| 香蕉视频成人在线观看| 亚洲欧美综合精品久久成人 | 欧美高清视频在线播放| 欧美成人精品在线| 欧美日韩午夜剧场| 国产午夜精品一区二区三区视频| 欧美激情1区| 韩国成人福利片在线播放| 激情六月婷婷综合| 亚洲另类自拍| 欧美一区二区国产| 欧美91福利在线观看| 亚洲人成免费| 久久综合九色99| 亚洲高清资源| 亚洲欧美日韩中文播放| 久久五月天婷婷| 欧美日韩综合久久| 尤物yw午夜国产精品视频明星| 亚洲三级影院| 久久精品国产综合精品| 亚洲黄色性网站| 欧美一区二区| 欧美日韩在线播放三区四区| 狠狠做深爱婷婷久久综合一区| 亚洲精品一二三| 久久女同精品一区二区| 一本一本久久a久久精品综合妖精| 欧美一区二区三区在线播放| 欧美理论在线播放| 原创国产精品91| 欧美在线视频一区二区三区| 最新国产成人在线观看| 午夜精品影院| 欧美午夜电影在线| 在线看片第一页欧美| 午夜宅男欧美| 日韩亚洲欧美综合| 老司机午夜精品视频| 国产偷久久久精品专区| 亚洲综合色丁香婷婷六月图片| 欧美激情影院| 蜜臀久久久99精品久久久久久 | 亚洲激情在线观看| 久久99伊人| 亚洲午夜视频在线观看| 欧美精品亚洲一区二区在线播放| 在线视频成人| 欧美xart系列在线观看| 久久精品二区三区| 国产精品视频免费观看| 亚洲永久免费观看| 一区二区91| 欧美性jizz18性欧美| 亚洲一区二区成人在线观看| 日韩视频三区| 欧美亚洲第一页| 亚洲欧美欧美一区二区三区| 亚洲激情婷婷| 欧美肥婆在线| 一道本一区二区| 亚洲人成在线观看| 欧美日韩午夜剧场| 久久久久久有精品国产| 蜜臀av一级做a爰片久久| 一区一区视频| 亚洲成人在线视频网站| 蜜桃av综合| 欧美一站二站| 1024精品一区二区三区| 亚洲福利在线视频| 欧美日韩一区二区三区视频| 一本一本久久a久久精品综合妖精| 99精品国产99久久久久久福利| 国产精品a久久久久| 欧美一区二区精美| 久久综合伊人77777尤物| 99精品国产在热久久| 在线综合亚洲| 激情六月综合| 亚洲私人黄色宅男| 又紧又大又爽精品一区二区| 鲁大师成人一区二区三区| 欧美日韩免费一区| 久久久久久久尹人综合网亚洲| 亚洲精品一区在线观看香蕉| 亚洲精品国产精品国自产观看浪潮| 欧美精品久久久久久久| 亚洲午夜av| 久久久久国产精品一区| 夜夜嗨av一区二区三区四季av| 一区二区三区精密机械公司| 国产亚洲精品福利| 亚洲国产一区在线| 国产精品国产自产拍高清av| 久久久久久伊人| 欧美日韩国产成人在线91| 久久国产精品一区二区三区四区| 裸体一区二区| 欧美一区二区三区的| 欧美国产激情| 久久在线免费观看| 国产精品理论片在线观看| 欧美成年人视频| 国产免费成人av| 亚洲精品美女在线观看| 伊人久久综合97精品| 亚洲欧美日韩综合| 亚洲一区综合| 欧美久久综合| 亚洲第一在线综合网站| 国内外成人在线| 亚洲综合第一页| 亚洲五月六月| 欧美日韩国产系列| 亚洲国产午夜| 亚洲日本在线视频观看| 久久精品道一区二区三区| 欧美呦呦网站| 国产精品视频精品| 一区二区三区四区国产| 一区二区日本视频| 欧美大片一区二区三区| 欧美第一黄网免费网站| 黄色成人在线网址| 亚洲电影欧美电影有声小说| 亚洲欧美国产日韩天堂区| 久久网站免费| 老司机精品久久| 激情一区二区| 久久另类ts人妖一区二区| 麻豆av一区二区三区| 激情亚洲成人| 久久综合伊人| 亚洲国产成人久久综合一区| 亚洲人成网站777色婷婷| 欧美1区2区| 亚洲高清二区| av成人激情| 国产精品成人一区二区| 亚洲一区二区三区国产| 午夜精品在线| 国产一区二三区| 老司机精品福利视频| 亚洲黄色尤物视频| 亚洲永久在线观看| 国产欧美一级| 久久这里有精品视频| 亚洲级视频在线观看免费1级| 日韩一区二区精品葵司在线| 国产精品久久国产精麻豆99网站| 亚洲欧美激情视频在线观看一区二区三区 | 免费欧美日韩| 亚洲精品乱码久久久久久| 亚洲午夜激情免费视频| 国产精品美女午夜av| 欧美亚洲三区| 亚洲国产91色在线| 亚洲综合三区| 免费成人高清| 久久er精品视频| 免费在线日韩av| 妖精成人www高清在线观看| 国产精品va在线播放| 久久大综合网| 亚洲毛片av| 久久久久久久网站| 亚洲美女色禁图| 国产亚洲综合精品| 欧美精品久久99| 久久精品久久综合| 99精品久久久| 免费中文字幕日韩欧美| 日韩小视频在线观看专区| 国产女人水真多18毛片18精品视频| 久色成人在线| 午夜一区在线| 99精品欧美一区二区三区综合在线| 久久综合给合| 午夜伦欧美伦电影理论片| 亚洲精品美女在线| 国产主播精品| 国产精一区二区三区| 欧美精品一区在线发布| 久久九九国产精品| 亚洲一区二区三区视频| 亚洲人成网站影音先锋播放| 快射av在线播放一区| 性欧美大战久久久久久久久| 日韩写真视频在线观看| 亚洲国产精品悠悠久久琪琪| 国产亚洲在线观看| 国产精品一区二区久久| 欧美视频日韩| 亚洲第一精品夜夜躁人人爽| 亚洲激情在线播放|