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

【C】動態(tài)規(guī)劃 之 多維最大最小路徑和

這篇具有很好參考價值的文章主要介紹了【C】動態(tài)規(guī)劃 之 多維最大最小路徑和。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

總結(jié)一下這類題型的思路:

每一步所求的最優(yōu)解 = 上一步的最優(yōu)解 + 這一步的情況

1.數(shù)字三角形

【C】動態(tài)規(guī)劃 之 多維最大最小路徑和,c語言,動態(tài)規(guī)劃,算法,開發(fā)語言【C】動態(tài)規(guī)劃 之 多維最大最小路徑和,c語言,動態(tài)規(guī)劃,算法,開發(fā)語言

主要思路:

1.到達(dá)每一個位置的最大和等于前一步最大和加上這一位置的值,而前一步要么是從左上下來,要么是從右上下來,這樣就將原問題分解了

2.記得初始化dp數(shù)組,不然里面元素初值是不確定的

//數(shù)字三角形
//給定一個三角形,每一個結(jié)點(diǎn)選擇移動至左下或者右下,
//找出一條路徑使路徑上數(shù)字和最大
#include<stdio.h>

int max(int a, int b){
	if(a>b){
		return a;
	}
	else
		return b;
}

int main(){
	int n;
	scanf("%d",&n);//輸入三角形行數(shù)
	int a[n+1][n+1],i,j;
	int dp[n+1][n+1];//記錄動態(tài)變化 
	for(i=0;i<=n;i++){
		for(j=0;j<=n;j++){
			dp[i][j]=-1;
		}
	}
	for(i=1;i<=n;i++){
		for(j=1;j<=i;j++){
			scanf("%d",&a[i][j]);
		}
	} 
	dp[1][1]=a[1][1];
	for(i=2;i<=n;i++){
		for(j=1;j<=i;j++){
			dp[i][j]=max(dp[i-1][j-1],dp[i-1][j])+a[i][j];
		}
	}
	int the_max=0;
	for(j=1;j<=n;j++){
		if(dp[n][j]>the_max){
			the_max=dp[n][j];
		} 
	}
	printf("%d",the_max);
	return 0;
}

2.最低通行費(fèi)

【C】動態(tài)規(guī)劃 之 多維最大最小路徑和,c語言,動態(tài)規(guī)劃,算法,開發(fā)語言

【C】動態(tài)規(guī)劃 之 多維最大最小路徑和,c語言,動態(tài)規(guī)劃,算法,開發(fā)語言

//最低通行費(fèi)
//N*N矩陣,左上角進(jìn),右下角出,不能斜對角通過,求最小和
#include<stdio.h>

int min(int a, int b){
	if(a>b)
		return b;
	else
		return a;
}

int main(){
	int N;//矩陣寬度 
	scanf("%d",&N);
	int a[N+1][N+1];
	int i,j;
	for(i=1;i<=N;i++){
		for(j=1;j<=N;j++){
			scanf("%d",&a[i][j]);
		}
	}
	int dp[N+1][N+1];//動態(tài)數(shù)組
	//初始化 ,求最小值,所以初始化盡可能大 
	for(i=0;i<=N;i++){
		for(j=0;j<=N;j++){
			dp[i][j]=10000000;
		}
	}
	//完善初始化(很重要的一步)
	//左上角元素
	dp[1][1]=a[1][1]; 
	//第一行只能從左邊來
	for(j=2;j<=N;j++){
		dp[1][j]=dp[1][j-1]+a[1][j];
	}
	//第一列只能從上面來 
	for(i=2;i<=N;i++){
		dp[i][1]=dp[i-1][1]+a[i][1];
	}
	//必須在2N-1個時間過去,所以只能從左邊或者上邊過來
	for(i=2;i<=N;i++){
		for(j=2;j<=N;j++){
			dp[i][j]=min(dp[i][j-1],dp[i-1][j])+a[i][j];
		}
	} 
	printf("%d",dp[N][N]);
	return 0;
}

3.方格取數(shù)

【C】動態(tài)規(guī)劃 之 多維最大最小路徑和,c語言,動態(tài)規(guī)劃,算法,開發(fā)語言

主要思路:

1.兩條路線一起走,每次記錄到達(dá)兩個點(diǎn)位置可取最大值,本來是用一個四維數(shù)組dp[i1][j1][i2][j2],但是我們發(fā)現(xiàn)每次只能往左或者往下走一步,說明每一步橫縱坐標(biāo)的和是相同的,就可以設(shè)一個k表示橫縱坐標(biāo)和,且i1+j1=k,i2+j2=k,用一個三維數(shù)組dp[k][i1][i2]替代四維,而可以降低時間復(fù)雜度(重要思維

2.每一個坐標(biāo)處的最大值,都等于上一步的最大值加上這一步可以獲得的值,而上一步k-1有四種可能,依次比較即可

注意點(diǎn):

1.給dp定義和初始化時要注意,從0,0開始賦初值(不然會訪問到無值的地址),并且第三維度的大小是N*2+1

2.三重循環(huán)里的判斷語句防止下標(biāo)越界

3.不用根據(jù)題目意思將遍歷過的地方設(shè)置為0,因?yàn)椴皇且淮涡缘倪^程,這里一步一步只能往右邊或者下面走是不會出現(xiàn)重復(fù)的

4.要注意,當(dāng)兩條路線的兩個點(diǎn)不是同一個點(diǎn)時才能相加,否則會重復(fù)相加文章來源地址http://www.zghlxwxcb.cn/news/detail-859424.html

//方格取數(shù)
//某些放入數(shù)據(jù),其他為0,兩條路徑,和最大,向下或向右走
/*輸入 
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
*/
//輸出:67 
#include<stdio.h> 
int max(int a, int b){
	return a > b ? a : b ;
}
int main(){
	int N;//方格N*N
	scanf("%d",&N);
	int np[N+1][N+1];
	//初始化
	int i,j,k;
	for(i=1;i<=N;i++){
		for(j=1;j<=N;j++){
			np[i][j]=0;
		}
	} 
	//放入數(shù)據(jù) 
	int a,b,c;
	scanf("%d %d %d",&a,&b,&c);
	while(a!=0 || b!=0 || c!=0){
		np[a][b]=c;
		scanf("%d %d %d",&a,&b,&c);
	}
	//dp[k][i1][j1]
	//i1+j1=i2+j2=k
	int dp[N*2+1][N+1][N+1];
	//初始化dp,注意下標(biāo)范圍 
	for(i=0;i<=N*2;i++){
		for(j=0;j<=N;j++){
			for(k=0;k<=N;k++){
				dp[i][j][k]=0;
			}
		}
	} 
	dp[2][1][1]=np[1][1];//左上角
	int i1,i2;
	for(k=2;k<=N*2;k++){
		for(i1=1;i1<=N;i1++){
			for(i2=1;i2<=N;i2++){
				int j1=k-i1;
				int j2=k-i2;
				//防止下標(biāo)越界 
				if(j1>=1 && j1<=N && j2>=1 && j2<=N){
					int t=np[i1][j1];
					if(i2!=i1) t+=np[i2][j2];//防止重復(fù)累加,一個地方只能過一次 
					//np[i1][j1]=np[i2][j2]=0; 
					//不能設(shè)為0,因?yàn)楸緛砭褪遣粫貜?fù)走的,如果設(shè)為0會影響其他位置的計(jì)算,導(dǎo)致所求值偏小 
					dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1-1][i2-1]+t);
					dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1][i2-1]+t);
					dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1-1][i2]+t);
					dp[k][i1][i2]=max(dp[k][i1][i2],dp[k-1][i1][i2]+t);
				}
			}
		}
	}
	printf("%d",dp[N*2][N][N]);
	return 0;
}

到了這里,關(guān)于【C】動態(tài)規(guī)劃 之 多維最大最小路徑和的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 算法刷刷刷|動態(tài)規(guī)劃篇|509.斐波那契數(shù)| 70.爬樓梯| 746.使用最小花費(fèi)爬樓梯| 62.不同路徑| 63不同路徑2| 343.正數(shù)拆分 | 96.不同的二叉搜索樹

    509. 斐波那契數(shù) 斐波那契數(shù) (通常用 F(n) 表示)形成的序列稱為 斐波那契數(shù)列 。該數(shù)列由 0 和 1 開始,后面的每一項(xiàng)數(shù)字都是前面兩項(xiàng)數(shù)字的和。也就是: F(0) = 0,F(xiàn)(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n 1 給定 n ,請計(jì)算 F(n) 。 70.爬樓梯 746.使用最小花費(fèi)爬樓梯 給你一個整數(shù)

    2023年04月23日
    瀏覽(24)
  • 【學(xué)會動態(tài)規(guī)劃】最小路徑和(9)

    【學(xué)會動態(tài)規(guī)劃】最小路徑和(9)

    目錄 動態(tài)規(guī)劃怎么學(xué)? 1. 題目解析 2. 算法原理 1. 狀態(tài)表示 2. 狀態(tài)轉(zhuǎn)移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后: 學(xué)習(xí)一個算法沒有捷徑,更何況是學(xué)習(xí)動態(tài)規(guī)劃, 跟我一起刷動態(tài)規(guī)劃算法題,一起學(xué)會動態(tài)規(guī)劃! 題目鏈接:64. 最小路徑和 - 力扣(Leet

    2024年02月16日
    瀏覽(20)
  • Java 動態(tài)規(guī)劃 64. 最小路徑和

    Java 動態(tài)規(guī)劃 64. 最小路徑和

    ? 代碼展示: ?dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+grid[i-1][j-1]; ?該題可以通過動態(tài)規(guī)劃解決,動態(tài)規(guī)劃的題根據(jù)以下的5大步驟便可輕松解決 ? ? ? ? 1.狀態(tài)表示 ? ? ? ? ? ? ? ? 題目要求我們計(jì)算從起點(diǎn)到最后一個位置的最小路徑和,我們可以創(chuàng)建一個dp表,dp【i】【j】表示從

    2024年02月13日
    瀏覽(20)
  • 【學(xué)會動態(tài)規(guī)劃】下降路徑最小和(8)

    【學(xué)會動態(tài)規(guī)劃】下降路徑最小和(8)

    目錄 動態(tài)規(guī)劃怎么學(xué)? 1. 題目解析 2. 算法原理 1. 狀態(tài)表示 2. 狀態(tài)轉(zhuǎn)移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后: 學(xué)習(xí)一個算法沒有捷徑,更何況是學(xué)習(xí)動態(tài)規(guī)劃, 跟我一起刷動態(tài)規(guī)劃算法題,一起學(xué)會動態(tài)規(guī)劃! 題目鏈接:931. 下降路徑最小和 - 力扣(

    2024年02月16日
    瀏覽(20)
  • 動態(tài)規(guī)劃問題——矩陣的最小路徑和

    動態(tài)規(guī)劃問題——矩陣的最小路徑和

    題目: 給定一個矩陣m,從左上角開始每次只能向右或者向下走,最后到達(dá)右下角的位置,路徑上所有的數(shù)字累加起來就是路徑和,返回所有路徑中最小的路徑和。 示例: 給定的m如下: 1? ? ? ? 3 ? ? ? ? 5? ? ? ? 9 8? ? ? ? 1? ? ? ? 3? ? ? ? 4? 5? ? ? ? 0? ? ? ? 6?

    2023年04月08日
    瀏覽(16)
  • 最小路徑和-力扣64-java 動態(tài)規(guī)劃

    最小路徑和-力扣64-java 動態(tài)規(guī)劃

    給定一個包含非負(fù)整數(shù)的 m x n 網(wǎng)格 grid ,請找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。 說明:每次只能向下或者向右移動一步。 示例 1: 輸入:grid = [[1,3,1],[1,5,1],[4,2,1]] 輸出:7 解釋:因?yàn)槁窂?1→3→1→1→1 的總和最小。 示例 2: 輸入:grid = [[1,

    2023年04月09日
    瀏覽(23)
  • 【動態(tài)規(guī)劃刷題 5】 最小路徑和&&地下城游戲

    【動態(tài)規(guī)劃刷題 5】 最小路徑和&&地下城游戲

    鏈接: 64. 最小路徑和 給定一個包含非負(fù)整數(shù)的 m x n 網(wǎng)格 grid ,請找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。 說明:每次只能向下或者向右移動一步。 輸入:grid = [[1,3,1],[1,5,1],[4,2,1]] 輸出:7 解釋:因?yàn)槁窂?1→3→1→1→1 的總和最小。 示例 2: 輸入

    2024年02月13日
    瀏覽(27)
  • 力扣120. 三角形最小路徑和(Java 動態(tài)規(guī)劃)

    力扣120. 三角形最小路徑和(Java 動態(tài)規(guī)劃)

    Problem: 120. 三角形最小路徑和 Problem:64. 最小路徑和 本題目可以看作是在上述題目的基礎(chǔ)上改編而來,具體的思路: 1.記錄一個int類型的大小的 n 乘 n n乘n n 乘 n 的數(shù)組(其中 n n n 為數(shù)組triangle的行數(shù))用于記錄 每一個當(dāng)前階段的最小路徑和 2.大體上可以依據(jù)題意得出動態(tài)轉(zhuǎn)移

    2024年01月22日
    瀏覽(19)
  • 【LeetCode:64. 最小路徑和 | 暴力遞歸=>記憶化搜索=>動態(tài)規(guī)劃 】

    【LeetCode:64. 最小路徑和 | 暴力遞歸=>記憶化搜索=>動態(tài)規(guī)劃 】

    ?? 算法題 ?? ?? 算法刷題專欄 | 面試必備算法 | 面試高頻算法 ?? ?? 越難的東西,越要努力堅(jiān)持,因?yàn)樗哂泻芨叩膬r值,算法就是這樣? ?? 作者簡介:碩風(fēng)和煒,CSDN-Java領(lǐng)域新星創(chuàng)作者??,保研|國家獎學(xué)金|高中學(xué)習(xí)JAVA|大學(xué)完善JAVA開發(fā)技術(shù)棧|面試刷題|面經(jīng)八股文

    2024年02月05日
    瀏覽(22)
  • 動態(tài)規(guī)劃|【路徑問題】禮物的最大價值(LCR 166.珠寶的最高價值)

    動態(tài)規(guī)劃|【路徑問題】禮物的最大價值(LCR 166.珠寶的最高價值)

    目錄 題目 題目解析 思路 1.狀態(tài)表示 2.狀態(tài)轉(zhuǎn)移方程 3.初始化 4.填表順序 5.返回值 代碼 LCR 166. 珠寶的最高價值 (現(xiàn)在leetcode上面是這個題)這個題跟下面這個題敘述方式一樣,就拿下面這個 題來講解) 題目描述: 在一個m*n的棋盤的每一格都放有一個禮物,每個禮物都有一

    2024年03月16日
    瀏覽(20)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包