1. 程式人生 > >什麼是動態規劃?動態規劃典型例題求解+程式碼

什麼是動態規劃?動態規劃典型例題求解+程式碼

class Solution {
public:
    int maximalSquare(vector<vector<char>>& matrix) {
        int dim=0;
        int row=matrix.size();
        if(row==0) return 0;
        int colum=matrix[0].size();
        vector<vector<int> > status(row,vector<int>(colum,0));
        for(int i=0;i<row;i++){
            status[i][0]=matrix[i][0]-'0';
            dim=dim<status[i][0]?status[i][0]:dim;
        }
        for(int i=0;i<colum;i++){
            status[0][i]=matrix[0][i]-'0';
            dim=dim<status[0][i]?status[0][i]:dim;
        }
        for(int i=1;i<row;i++)
            for(int j=1;j<colum;j++){
                if(matrix[i][j]=='0')
                    status[i][j]=0;
                else{
                    status[i][j]=min(status[i-1][j],status[i][j-1],status[i-1][j-1])+1;
                    if(status[i][j]>dim)
                        dim=status[i][j];
                }
            }
        return dim*dim;
        
    }
    int min(int a,int b,int c)
    {
        int temp;
        temp=a<b?a:b;
        if(c<temp)
        temp=c;
        return temp;
    }
};

昨天刷leetcode遇到一道題221. Maximal Square.

此題是一道典型的動態規劃可以解決的問題。

程式碼如下:

所以一個問題是該用遞推、貪心、搜尋還是動態規劃,完全是由這個問題本身階段間狀態的轉移方式決定的!

每個階段只有一個狀態->遞推;
每個階段的最優狀態都是由上一個階段的最優狀態得到的->貪心;
每個階段的最優狀態是由之前所有階段的狀態的組合得到的->搜尋;
每個階段的最優狀態可以從之前某個階段的某個或某些狀態直接得到而不管之前這個狀態是如何得到的->動態規劃。



作者:王勐
連結:https://www.zhihu.com/question/23995189/answer/35429905
來源:知乎
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。 看完了上面關於動態規劃的概念講解,下面動手動腦看幾道例題:

相關推薦

什麼是動態規劃動態規劃典型例題求解+程式碼

class Solution { public: int maximalSquare(vector<vector<char>>& matrix) { int dim=0; int row=matrix.

動態規劃典型例題解析

什麼是動態規劃 動態規劃的主要思想是把問題劃分為一個個子狀態,一個狀態的最優解往往是基於其前一個狀態的最優解。兩個狀態之間的關係,我們就稱之為狀態轉移方程。這裡引出了狀態和狀態轉移方程的概念:狀態是一個當前的值,這個值是通過前一個值以及狀態轉移方程推得的。在解決動態規劃問題的時候,我們往

【演算法筆記】動態規劃,三個例題(解題思路與C++程式碼

寫在前面,我想發個感慨:       當年大學時代ACM的時候,動態規劃演算法對鄙人來說一直算得上魔障,有時能敲出來程式碼,有時候狗咬刺蝟無從下嘴。       以至於一直認為動態規劃是ACM的代表演

動態規劃典型例題--連續子陣列的最大和

題目描述:給定一個數組arr,陣列中的元素有整數也有負數,陣列中的一個或者連續多個數組成一個子陣列。 求所有子數組裡面的最大和。例如現在有陣列 {1 , -2 , 3 , 10 , -4 , 7 ,

【轉載】通過金礦模型介紹動態規劃 (動態規劃入門)

先附上原文地址:http://www.cnblogs.com/sdjl/articles/1274312.html 通過金礦模型介紹動態規劃         對於動態規劃,每個剛接觸的人都需要一段時間來理解,特別是第一次接觸的時候總是想不通為什麼這種方法可行,這篇文章就是為了

通過金礦模型介紹動態規劃 (動態規劃入門)

今天在網上看到一個講動態規劃的文章,是以01揹包為例的,這文章和書上的講解非常不一樣,令我眼前一亮,於是轉載一下下~~~ (說明一下,本人非常痛恨教材公式定理漫天飛,實際的講解卻講得非常枯澀難懂,這種中國式的教育已經延綿了幾千年了,現在中國的教材還是這個樣子,講清楚些明白些就那麼難麼?高中有個老師講的一句話一

在C#中動態呼叫封裝好的opencv(C++)程式碼

由於專案需要在C#中呼叫opencv的函式處理影象,而暫時沒時間瞭解CLR/C++,所以就採用封裝API的方式呼叫,使用的IDE是VS2015,記錄過程如下: 一、 建立封裝好的動態連結庫 1、建立新專案 在VS2015新建visual C++專案——Win32專案——應用程式型別DLL

Laravel5.5 動態切換多語言操作(直接上程式碼)

第一步:新建所有的語言包檔案  resources/lang messages.php 就是返回一個數組 return [] 格式 中文的: return [ "test" => "這裡是測試", "test1" => "繼續測試",

Spring的AOP 動態代理基礎--java代理物件的程式碼演示

必用 的Spring 是以後的程式設計 的生態 Spring–AOP ===預設就是 JDK 的動態代理 -----》 Spring 動態代理的選擇 ----spring的通知: 就是增強– 連線點— 就是 方法 切入點----- 要增強的方法 連線點與 切入點 的區別: 實現裡的 SQ

使用Vue動態生成form表單的例項程式碼

具有資料收集、校驗和提交功能的表單生成器,包含複選框、單選框、輸入框、下拉選擇框等元素以及,省市區三級聯動,時間選擇,日期選擇,顏色選擇,檔案/圖片上傳功能,支援事件擴充套件。 歡迎大家star學習交流:github地址 示例   image   https://raw.g

jQuery----動態向頁面(jsp)新增程式碼(append)

append() 方法在被選元素的結尾(仍然在內部)插入指定內容。 語法:$(selector).append(content) 例項: var creatPrintList = function(data){ var innerHtml = ""; for(

css橫向 最右和最左動態寬度,中間寬度自適應程式碼

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width,in

關於動態載入html,CSS,javascript程式碼

隨著開始學習前端技術,我也是自然的接觸到了html、CSS、JavaScript這些在網頁前端中最基礎的東西。我也在其中遇到了很多有意思的問題。在一開始我製作的網頁都是用html先把結構全部搭建好了,之後再使用CSS來設定設定html元素的樣式屬性,最後使用JavaScri

ABAP根據輸入的表名動態生成上傳TXT資料的程式碼

開發技術: 1.文字檔案上載技術 2.動態程式程式碼生成技術 3.ABAP動態程式執行技術 4.TXT文字檔案對應用Table欄位編輯技術   注意事項: 檔案檔案編輯過程中時間日期格式為 20060201 120000 表示 2006.02.01 12:00:00 文字檔

動態載入apk檔案並呼叫其程式碼

編寫一個apk,用於匯出方法,供其他apk呼叫 public class Dynamic implements IDynamic{ private Activity mActivity; public Dynamic() {

集合與泛型典型例題

得到 一個 i++ 處理 控制臺輸出 通過 功能 說明 題目 1、數制轉換問題。數制轉換問題是將任意一個非負的十進制數轉換為其它進制的數,這是計算機實現計算的基本問題。其一般的解決方法的利用輾轉相除法。以將一個十進制數N轉換為八進制數為例進行說明。假設N=5142,示例圖:

python例題(while、for迴圈的典型例題 一)

一、先了解一些python內部模組:      1、生成隨機數(隨機引數):                (1)利用集合set可變的的性質轉化為隨機的列表。 set1 = {1

典型陣列處理程式碼

package com.arithmetic; import java.util.Arrays; public class Array { // 獲得陣列最大值 public static double getMaxValue(double[] array) {

典型字串處理程式碼

package com.arithmetic; public class StringApi { // 判斷字串是否是一條迴文 public static boolean isPalindrome(String s) { int N = s.length();

動態呼叫動態語言之Java指令碼API

我們不需要將動態語言編譯為 Java位元組碼就可以在 Java 應用程式中使用它們。使用 Java Platform, Standard Edition 6 (Java SE)中新增的指令碼包(並且向後相容 Java SE 5),Java 程式碼可以在執行時以一種簡單的、統一的方式呼叫多種動態語言。