国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

頭歌 算法 實驗七 動態(tài)規(guī)劃

這篇具有很好參考價值的文章主要介紹了頭歌 算法 實驗七 動態(tài)規(guī)劃。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

第1關:數(shù)塔問題

300

  • 任務要求
  • 參考答案
  • 評論9
  • 任務描述
  • 相關知識
  • 編程要求
  • 解題思路:
  • 測試說明

任務描述

本關任務:編寫用動態(tài)規(guī)劃解決數(shù)塔問題。

相關知識

為了完成本關任務,你需要掌握:動態(tài)規(guī)劃。

編程要求

頭歌 算法 實驗七 動態(tài)規(guī)劃,頭歌算法,算法,動態(tài)規(guī)劃

求上圖從頂層到頂層的一個路徑,使路徑上的數(shù)字和最大。要求輸出最大的數(shù)字和max和數(shù)值和最大的路徑。

解題思路:

原始信息有層數(shù)和數(shù)塔中的數(shù)據,層數(shù)用一個整型變量n存儲,數(shù)塔中的數(shù)據用二維數(shù)組data,存儲成如下的下三角陣:

 
  1. 9
  2. 12 15
  3. 10 6 8
  4. 2 18 9 5
  5. 19 7 10 4 16

必需用二維數(shù)組d存儲各階段的決策結果。二維數(shù)組d的存儲內容如下:

 
  1. d[n][j]=data[n][j], j=1,2,……,n;
  2. d[i][j]=max(d[i+1][j],d[i+1][j+1])+data[i][j], i=n-1,n-2,……1,j=1,2,……,i

最后d[1][1]存儲的就是問題的結果。

測試說明

平臺會對你編寫的代碼進行測試:

測試輸入:

 
  1. 5
  2. 9
  3. 12 15
  4. 10 6 8
  5. 2 18 9 5
  6. 19 7 10 4 16

輸出示例:

 
  1. max=59
  2. 數(shù)值和最大的路徑是:9->12->10->18->10

開始你的任務吧,祝你成功!

#include <stdio.h>
int main(){
    int a[50][50][4],i,j,n;
    // printf("Please input the number of rows:\n");
    // scanf("%d",&n);
    n = 5;
    i=1;
    a[1][1][1]=9;
    a[2][1][1]=12, a[2][2][1]=15;
    a[3][1][1]=10, a[3][2][1]=6,  a[3][3][1]=8;
    a[4][1][1]=2,  a[4][2][1]=18, a[4][3][1]=9,  a[4][4][1]=5;
    a[5][1][1]=19, a[5][2][1]=7,  a[5][3][1]=10, a[5][4][1]=4, a[5][5][1]=16;
    for(i=1;i<=n;i++)
        for(j=1; j<=i; j++)
        {
            a[i][j][2]=a[i][j][1];
            a[i][j][3]=0;
        }
    for(i=n-1; i>=1; i--)
        for(j=1; j<=i; j++)
            if(a[i+1][j][2]>a[i+1][j+1][2])
            {
                 a[i][j][2] = a[i][j][2] + a[i+1][j][2];
                 a[i][j][3] = 0;
            }
            else
            {
                 a[i][j][2] = a[i][j][2] + a[i+1][j+1][2];
                 a[i][j][3] = 1;
            }
            printf("max=%d\n",a[1][1][2]);
            printf("數(shù)值和最大的路徑是:");
            j=1;
            for(i=1;i<=n-1;i++)
            {
                printf("%d->",a[i][j][1]);
                j = j+a[i][j][3];
            }
            printf("%d\n\n\n",a[n][j][1]);
    return 0;
}

第2關:最長公共子序列

400

  • 任務要求
  • 參考答案
  • 評論9
  • 任務描述
  • 相關知識
  • 編程要求
  • 解題思路:
  • 測試說明

任務描述

本關任務:編寫用動態(tài)規(guī)劃解決最長公共子序列問題。

相關知識

為了完成本關任務,你需要掌握:動態(tài)規(guī)劃。

編程要求

求字符串序列“ABCDBAB”和“BDCABA”的最長公共子序列

解題思路:

遞推關系分析: 設 A=“a0,a1,…,am?1”,B=“b0,b1,…,bn?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”的一個最長公共子序列。 定義c[i][j]為序列“a0,a1,…,ai?1”和“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]。 由二維數(shù)組c的遞歸定義,c[i][j]的結果依賴于c[i?1][j?1],c[i?1][j]和c[i][j?1]。可以從c[m][n]開始,跟蹤c[i][j]結果的產生過程,從而逆向構造出最長公共子序列。

測試說明

平臺會對你編寫的代碼進行測試:

測試輸入:

 
  1. a=“ABCDBAB”
  2. b=“BDCABA”

輸出示例:

 
  1. BCBA

開始你的任務吧,祝你成功!

#include "stdio.h"
#include "string.h"
char a[1000]="ABCDBAB";
char b[1000]="BDCABA";
char str[100];
int c[100][100]; 
int lcs_len()
{   
    int m,n,i,j,lcs;
    m = strlen(a);
    n = strlen(b);
    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];
       }
    lcs = c[m][n];
    return lcs; 
}
void build_lcs()
{   
    int k,i=strlen(a),j=strlen(b);
    k = lcs_len();
    str[k]=' ';
    while(k>0)
        if(c[i][j]==c[i-1][j])
            i=i-1;
        else if(c[i][j]==c[i][j-1])
                j=j-1;
             else
             {
                 k=k-1;
                 str[k]=a[i-1];
                 j=j-1;
             }
}
int main()
{  
    build_lcs();
    printf("%s",str); 
    return 0;
}

第3關:求序列-2 11 -4 13 -5 -2的最大子段和

300

  • 任務要求
  • 參考答案
  • 評論9
  • 任務描述
  • 相關知識
  • 編程要求
  • 解題思路:
  • 測試說明

任務描述

本關任務:編寫用動態(tài)規(guī)劃解決最大子段和問題。

相關知識

為了完成本關任務,你需要掌握:動態(tài)規(guī)劃。

編程要求

給定由n個整數(shù)(可能為負數(shù))組成的序列:a1,a2,……,an, 求該序列的最大子段和。當所有整數(shù)均為負數(shù),定義其最大子段和為0。

解題思路:

定義b[j]=max(a[i]+a[i+1]+…+a[j]),其中1<=i<=j,并且1<=j<=n。那么所求的最大子段和可以表示為max b[j],1<=j<=n。 由b[j]的定義可知,當b[j?1]>0時b[j]=b[j?1]+a[j],否則b[j]=a[j]。故b[j]的動態(tài)規(guī)劃遞歸表達式為: b[j]=max(b[j?1]+a[j],a[j]),1<=j<=n。

測試說明

平臺會對你編寫的代碼進行測試:

測試輸入:

 
  1. 6
  2. -2 11 -4 13 -5 -2

輸出示例:

 
  1. 20

開始你的任務吧,祝你成功!

#include <stdio.h>
int maxsubsequence(int n,int a[],int b[],int max)
{
    for (int i = 0; i < n; i++)
    {
        if (i == 0)
        {
            b[i] = a[i];
            max = b[i];
        }
        else
        {
            if (b[i - 1] <= 0)
                b[i] = a[i];
            else
                b[i] = b[i - 1] + a[i];
            if (b[i] > max)
                max = b[i];
        }
    }
    return max;
}
int main()
{
    int n;
    scanf("%d",&n);
    int a[1000];
    for (int i = 0; i < n; i++)
        scanf("%d",&a[i]);
    int b[100],max = 0;
    max = maxsubsequence(n, a, b, max);
    printf("%d",max);
}

第4關:求最長的單調遞增子序列長度

400

  • 任務要求
  • 參考答案
  • 評論9
  • 任務描述
  • 相關知識
  • 編程要求
  • 解題思路:
  • 測試說明

任務描述

本關任務:編寫用動態(tài)規(guī)劃解決求最長的單調遞增子序列長度問題。

相關知識

為了完成本關任務,你需要掌握:動態(tài)規(guī)劃。

編程要求

給定一個長度為n的數(shù)組,找出一個最長的單調遞增子序列(不一定連續(xù),但是順序不能亂)。例如:給定一個長度為7的數(shù)組A5,6,7,1,2,8,9,則其最長的單調遞增子序列為5,6,7,8,9,長度為5。求318714101223411624的最長的單調遞增子序列長度。

解題思路:

設長度為n的數(shù)組為(a[0],a[1],a[2],...,a[n?1]),則假定以a[j]結尾的數(shù)組序列的最長遞增子序列長度為L(j),則L(j)=max(L(i))+1,i<j且a[i]<a[j]。也就是說,我們需要遍歷在j之前的所有位置i(從0到j?1),找出滿足條件a[i]<a[j]的L(i),求出max(L(i))+1即為L(j)的值。最后,我們遍歷所有的L(j)(從0到n?1),找出最大值即為最大遞增子序列。

測試說明

平臺會對你編寫的代碼進行測試:

測試輸入:

 
  1. 10
  2. 3 18 7 14 10 12 23 41 16 24

輸出示例:

 
  1. 6

開始你的任務吧,祝你成功!

#include <stdio.h>
/********** Begin **********/
int main(){
	 int n;
	 scanf("%d",&n);
	 int m[n][3];
	 m[0][1]=1;
	 m[0][2]=0;
	 for(int i=0;i<n;i++){
		scanf("%d",&m[i][0]);
		if(i!=0){
			m[i][1]=0;
			int k=i-1;
			while(k>=0){
				if(m[i][0]>m[k][0]){
						if(k==i-1){
							m[i][1]=m[k][1]+1;
							m[i][2]=k;
						}
						else{
							int max=m[k][1]+1;
							if(max>m[i][1]){
								m[i][1]=max;
								m[i][2]=k;	
							}
					    }
				}
			 k--;
			}
			if(k<0&&m[i][1]==0){
			    m[i][1]=1;
			    m[i][2]=i;
			}
		}
	 }
 
	int max=m[0][1],j=0;
	for(int i=0;i<n;i++){
	      if(m[i][1]>=max){
	             max=m[i][1];
	             j=i;
	      }
	 }
	printf("%d\n",max);
 
 
}
/********** End **********/

第5關:矩陣連乘問題

400

  • 任務要求
  • 參考答案
  • 評論9
  • 任務描述
  • 相關知識
  • 編程要求
  • 測試說明

任務描述

本關任務:編寫用動態(tài)規(guī)劃解決矩陣連乘問題。

相關知識

為了完成本關任務,你需要掌握:動態(tài)規(guī)劃。

編程要求

將矩陣連乘積AiAi+1…Aj簡記為A[i:j],其中i<=j。設在矩陣Ak和Ak+1之間將矩陣鏈斷開,則其相應加括號為(AiAi+1…Ak) (Ak+1Ak+2…Aj)。A[i:j]的計算量等于三部分計算量之和: (1)A[i:k]的計算量, (2)A[k+1:j]的計算量, (3)A[i:k]與A[k+1:j]相乘的計算量。 設計算A[i:j]所需最少乘積數(shù)目為,則原問題的最優(yōu)值為。 當i=j時,a[i:j]=Ai?,因此,m[i][j]=0,i=1,???,n 當i<j時,m[i][j]=i<k<jmin?{m[i][k]+m[k+1][j]+pi?1?pk?pj?} 其中,矩陣Ai?的矩陣數(shù)為pi?1?×pi? 矩陣A1?的維度:p0?p1?=3035 矩陣A2?的維度:p1?p2?=3515 矩陣A3?的維度:p2?p3?=155 矩陣A4?的維度:p3?p4?=510 矩陣A5?的維度:p4?p5?=1020 矩陣A6?的維度:p5?p6?=2025 求這6個矩陣連乘的最小相乘次數(shù)。

測試說明

平臺會對你編寫的代碼進行測試:

測試輸入:

 
  1. 6
  2. 30 35
  3. 35 15
  4. 15 5
  5. 5 10
  6. 10 20
  7. 20 25

輸出示例:

 
  1. m[1][6]=15125

開始你的任務吧,祝你成功!文章來源地址http://www.zghlxwxcb.cn/news/detail-851190.html

#include <stdio.h>
#include <stdlib.h>
/********** Begin **********/
int main(){
	int n;
	scanf("%d",&n);
	int a[n][2];
	int b[n][n]={0};
	for(int i=0;i<n;i++){
	    scanf("%d %d",&a[i][0],&a[i][1]);   
	}
	
	for(int i=1;i<n;i++){
	    for(int j=0;j<n-i;j++){
	      b[j][j+i]=b[j][j]+b[j+1][j+i]+a[j][0]*a[j][1]*a[j+i][1];         
	      int k=j+1;
	      for(;k<j+i;k++){
	              int t=b[j][k]+b[k+1][j+i]+a[j][0]*a[k][1]*a[j+i][1];
	                if(t<b[j][j+i]) {
	                    b[j][j+i]=t;
	                }
	              
	      }
	
	    }
	        
	}
	printf("m[%d][%d]=%d",1,n,b[0][n-1]);
	return 0;
}
/********** End **********/

到了這里,關于頭歌 算法 實驗七 動態(tài)規(guī)劃的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!

本文來自互聯(lián)網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。如若轉載,請注明出處: 如若內容造成侵權/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經查實,立即刪除!

領支付寶紅包贊助服務器費用

相關文章

  • 算法設計與分析實驗---動態(tài)規(guī)劃

    算法設計與分析實驗---動態(tài)規(guī)劃

    任務描述 沿著河岸擺放 N 堆石子,現(xiàn)要將石子有次序地合并成一堆,規(guī)定每次只能選相鄰的 2 堆合并成新的一堆,并將新的一堆的石子數(shù),記為該次合并的得分。 例如: 4 堆石子 4,5,9,4 ,可以按 (((4,5),9),4) 合并。 第一次合并得分是 9 分,合并之后石子堆是 9,9,4 第二次合并得

    2024年02月08日
    瀏覽(21)
  • 算法設計與分析 實驗三 動態(tài)規(guī)劃

    1.打家劫舍:? 給定一個代表每個房屋存放金額的非負整數(shù)數(shù)組,計算你 不觸動警報裝置的情況下 ,一夜之內能夠偷竊到的最高金額。 入: 每組測試案例有兩行,第一行只有一個整數(shù)N,代表著有N間房屋 第二行有N個整數(shù),代表著每間房屋里的金額,金額范圍[0, 1000]。 出:

    2024年01月24日
    瀏覽(27)
  • 算法設計與分析實驗:動態(tài)規(guī)劃與貪心

    算法設計與分析實驗:動態(tài)規(guī)劃與貪心

    目錄 一、零錢兌換 1.1 思路一:動態(tài)規(guī)劃 1.2?思路二:貪心 二、安排工作以達到最大效益 2.1 具體思路 2.2 思路呈現(xiàn) 2.3 代碼實現(xiàn) 2.4 復雜度分析 2.5 運行結果 三、雇傭k名工人的最低成本 3.1 具體思路 3.2 思路展示 3.3 代碼實現(xiàn) 3.4 復雜度分析 3.5 運行結果 結尾語 “生活有意思的

    2024年02月19日
    瀏覽(27)
  • 【Python算法】實驗12-動態(tài)規(guī)劃與背包問題

    目錄 實驗內容 1.數(shù)塔dp -A 2.骨牌鋪方格 3.一只小蜜蜂

    2024年02月15日
    瀏覽(19)
  • 【Python算法】實驗8-動態(tài)規(guī)劃與背包問題

    目錄 實驗內容 1.數(shù)塔dp -A 2.骨牌鋪方格 3.一只小蜜蜂

    2023年04月19日
    瀏覽(32)
  • 南郵|算法分析與設計實驗二 動態(tài)規(guī)劃法

    南郵|算法分析與設計實驗二 動態(tài)規(guī)劃法

    目錄 實驗目的 實驗內容 實驗步驟 一、最長公共子序列 二、矩陣連乘? 加深對動態(tài)規(guī)劃法的算法原理及實現(xiàn)過程的理解,學習用動態(tài)規(guī)劃法解決實際應用中的 最長公共子序列問題 和 矩陣連乘問題 ,體會 動態(tài)規(guī)劃法 和 備忘錄方法 的異同。 一、用動態(tài)規(guī)劃法和備忘錄方法

    2024年02月01日
    瀏覽(19)
  • 湘潭大學 算法設計與分析實驗 回溯 動態(tài)規(guī)劃 貪心 模擬退火解決背包問題

    https://download.csdn.net/download/SQ_ZengYX/88620871 測試用例

    2024年02月02日
    瀏覽(42)
  • 算法設計與分析實驗二:動態(tài)規(guī)劃法求解TSP問題和01背包問題

    算法設計與分析實驗二:動態(tài)規(guī)劃法求解TSP問題和01背包問題

    【實驗內容】 (1)tsp問題:利用動態(tài)規(guī)劃算法編程求解TSP問題,并進行時間復雜性分析。 輸入:n個城市,權值,任選一個城市出發(fā); 輸出:以表格形式輸出結果,并給出向量解和最短路徑長度。 (2)01背包問題:利用動態(tài)規(guī)劃算法編程求解0-1背包問題,并進行時間復雜性分

    2024年02月03日
    瀏覽(20)
  • 【計算機網絡實驗】實驗三 IP網絡規(guī)劃與路由設計(頭歌)

    【計算機網絡實驗】實驗三 IP網絡規(guī)劃與路由設計(頭歌)

    目錄 一、知識點 二、實驗任務 三、頭歌測試 IP子網掩碼的兩種表示方法 ?? 32位IP子網掩碼,特點是從高位開始連續(xù)都是1,后面是連續(xù)的0,它有以下兩種表示方法: 傳統(tǒng)表示法,如:255.255.255.0 IP前綴(長度),如:24,表示IP地址的前24位是網絡位。 節(jié)點、網段、廣播三種

    2024年02月04日
    瀏覽(141)
  • 算法設計與分析實驗4 :利用動態(tài)規(guī)劃的方法解決子集等和分割判斷問題

    實驗4 ?利用動態(tài)規(guī)劃的方法解決子集等和分割判斷問題 一、實驗目的 1. 了解動態(tài)規(guī)劃的主要思想。 2. 掌握背包問題解決方法用以解決該問題。 3. 分析核心代碼的時間復雜度和空間復雜度。 二、實驗內容和要求 題目:給定一個只包含正整數(shù)的非空數(shù)組。是否可以將這個數(shù)組

    2024年04月23日
    瀏覽(29)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領取紅包,優(yōu)惠每天領

二維碼1

領取紅包

二維碼2

領紅包