高度な動的なプログラミング

理論解析

動的なプログラミングを実際に解析し、現在の問題を解決して、質問の前に答えを使用するために、質問の前に答えを覚えているし、2つの非常に重要なステップがあり、されて  解体  し、  定義された状態

動的計画法、動的計画法の行列クラスの問題の特定のクラスにこの時間は、この種の問題への配慮のためのアイデアやポイントを見てみましょう。

また、動的プログラミングはクラスの座標と呼ばれる動的プログラミング行列、通常、あなたの行列を与えるような問題、いくつかの情報を共有するマトリックスは、その後、あなたはその情報に基づいて問題を解決する必要があります。

一般に、このような動的なプログラミングの問題を考えて、我々は唯一の現在の位置の状態を考えると、現在位置とその進歩的な関係の隣人を見しようとする必要があるとき、話す、我々は漸化式に到着したい、どの動的なプログラミングの問題のクラスは比較的簡単です

 

異なるパス

説明: M  及び  nは  ない以上100以下の値。

トピック分析:

  • 解体問題:タイトルは言い、各移動のみそれを介して、特定の場所のために、現在の位置及びその隣接位置との関係に焦点を当てる右または下、動的プログラミング行列クラス必要に唯一のルートであることができますそれは上から来たか、それはあなたが現在の位置に到達するために別のパスを要求した場合ので、私たちはその上方位置に到達するために異なるパスを知っておく必要があり、左から来て、異なるパスのその左の位置に到達しました
  • ステータス定義:動的なプログラミングが状態の定義は比較的簡単である行列、あなただけの問題を解体、現在の場所で見ることができ、我々は現在の位置とその近隣諸国との関係を解析し、事実を述べたそれぞれの場所をカウントすることができます終わりで、状態は「で表される位置に原点から異なる経路の数
  • 漸化式:DP [I] [J] = DP [I]、[J-1] + DP [I-1]〜[J]
  • 実現は:我々は、彼らが唯一の方向から来ることができるので、境界線と左エッジ上のポイントに、配列の初期化の問題の状態を考慮しなければならない、などだけ左方向、左マージンから来ることができるこの境界上の点として、別々に検討する必要がありますポイントは早期治療のように、彼ら事実だけでは、この上に一方向から異なるパスの数を来ることができます。
#include <iostream>
#include <cstdio>
#include <algorithm> 
using namespace std;
int main(){
	int m,n;//行,列
	cin >>m>>n;
	int dp[m][n];
	for(int i=0;i<n;i++){
		dp[0][i]=1;
	}
	for(int i=0;i<m;i++){
		dp[i][0]=1;
	}
	for(int i=1;i<m;i++){
		for(int j=1;j<n;j++){
			dp[i][j]=dp[i-1][j]+dp[i][j-1];
		}
	}
	cout <<dp[m-1][n-1];
	return 0;
} 

異なるパス(障害物)

分析タイトル

在上面那道题的基础上,矩阵中增加了障碍物,这里只需要针对障碍物进行判断即可,如果当前位置是障碍物的话,状态数组中当前位置记录的答案就是 0,也就是没有任何一条路径可以到达当前位置,除了这一点外,其余的分析方法和解题思路和之前 一样 

 

#include <iostream>
#include <cstdio>
int dp[100][100];
using namespace std;
int main(){
	int m,n;
	cin >>m>>n;
	for(int i=0;i<m;i++){
		for(int j=0;j<n;j++){
			cin >>dp[i][j];
		}
	}
	for(int i=0;i<n;i++){
		dp[0][i]=(dp[0][i]==1)?0:1; 
	}
	for(int i=0;i<m;i++){
		dp[i][0]=(dp[i][0]==1)?0:1;
	}
	for(int i=1;i<m;i++){
		for(int j=1;j<n;j++){
			dp[i][j]=(dp[i][j]==1)?0:dp[i-1][j]+dp[i][j-1];
		}
	}
	cout <<dp[m-1][n-1];
	return 0;
} 

最小路径和

给定一个包含非负整数的 m x n 网格,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

 

题目解析:

  • 问题拆解:到达终点pb[i][j]的数字最小和,及求到达pb[i][j-1],pb[i-1][j]最小和
  • 状态定义:状态表示是 “从起点到达该位置的最小和
  • 递推方程:dp[i][j]=min(dp[i][j-1],dp[i-1][j])
  • 实现:我们还要考虑状态数组的初始化问题,对于上边界和左边界的点,因为它们只能从一个方向过来,需要单独考虑,比如上边界的点只能从左边这一个方向过来,其路径最小和就是到达左边元素的最小和

 

发布了107 篇原创文章 · 获赞 18 · 访问量 6303

おすすめ

転載: blog.csdn.net/qq_43109978/article/details/104075879