1. 程式人生 > >【演算法 詳解】 二維動態規劃

【演算法 詳解】 二維動態規劃

馬攔過河卒

原題傳送門
這一到題目也是比較基礎的動態規劃,也可以理解為是遞推,主要是運用加法原理,思維難度不大。我們要求從 0 0

n,n)" role="presentation"> n n 的方案總數,如果沒有馬的話,我們可以這麼做:
f [ i ] [ j ]
為從 0
0
走到 i j 的方案總數,我們知道一定是有上面和左邊走來,所以只需要累加上面和左邊的方案數即可。我們得出:

f [ i ] [ j ] = f [ i 1 ] [ j ] + f [ i ] [ j 1 ] f [ 0 ] [ 0... m ] = f [ 0... n ] [ 0 ] = 1 )
我們來思考一下馬的問題:
1.當馬攔住了 0 0... m 0... n , 0 ) 的時候,攔住的且後面的必然走不到,所以停止賦值
2.如果馬攔住了 x y x 0 y 0 ,則不進行狀態轉移即可
程式碼如下:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int B1,B2,H1,H2;
    cin>>B1>>B2>>H1>>H2;
    int Vis[20][20]={};
    int dx[9]={0,2,1,-1,-2,-2,-1,1,2};
    int dy[9]={0,1,2,2,1,-1,-2,-2,-1};
    for (int i=1;i<=9;i++)
    {
        int H3=H1+dx[i];
        int H4=H2+dy[i];
        if (H3>=0&&H4>=0) 
            Vis[H3][H4]=1;
    }
    int Find[20][20]={};
    for (int i=0;i<=B2;i++)
        if (Vis[0][i]==0)
            Find[0][i]=1;
        else
        {
            for (int j=i;j<=B2;j++)
                Vis[0][j]==1;
            break;
        }
    for (int i=0;i<=B1;i++)
        if (Vis[i][0]==0)
            Find[i][0]=1;
        else
        {
            for (int j=i;j<=B1;j++)
                Vis[j][0]=1;
                break;
        }
    for (int X=1;X<=B1;X++)
        for (int Y=1;Y<=B2;Y++)
            if (Vis[X][Y]==0)
                Find[X][Y]=Find[X-1][Y]+Find[X][Y-1];
    cout<<Find[B1][B2];
    return 0;
}

農田個數

題目描述

你的老家在農村。過年時,你回老家去拜年。你家有一片N×MN×M農田,將其看成一個N×MN×M的方格矩陣,有些方格是一片水域。你的農村伯伯聽說你是學計算機的,給你出了一道題: 他問你:這片農田總共包含了多少個不存在水域的正方形農田。
兩個正方形農田不同必須至少包含下面的兩個條件中的一條:
1 邊長不相等
2 左上角的方格不是同一方格

輸入格式

輸入資料第一行為兩個由空格分開的正整數N、M(1<=m< n <=1000)
第2行到第N+1行每行有M個數字(0或1),描述了這一片農田。0表示這個方格為水域,否則為農田(注意:數字之間沒有空格,而且每行不會出現空格)

輸出格式

滿足條件的正方形農田個數。

樣例資料

input

3 3
110
110
000

output

5
樣例解釋 邊長為1的正方形農田有4塊 邊長為2的正方形農田有1塊 合起來就是5塊

資料規模與約定

時間限制:1s
空間限制:256MB

求多少個正方形,我們設 F [ i ] [ j ] 為以 i j 為右下角的正方形個數。如果你畫過圖,就能夠發現:右下角的個數就是以這個點右下角的最大正方形,因為大正方形包含了無數個小正方形,基於正方形的特殊性,我就不難知道這一個性質。然後我們就去考慮,如何去轉移,再通過畫圖可以發現:這個點所能形成的最大正方形與左邊的點,左上角的點和上面的點所能形成的最大正方形的個數的最小值有關,也就是 m i n ( F [ i 1 ] [ j ] , F [ i ] [ j 1 ] , F [ i 1 ] [ j 1 ] ) 。那麼這個數值具體是多少呢?就是這個數值 + 1 ;即在原來形成的正方形的基礎上加上了這個右下角。因此,我們可以得到:

F [ i ] [ j ] = m i n ( F [ i 1 ] [ j ] , F [ i ] [ j 1 ] , F [ i 1 ] [ j 1 ] ) + 1
程式碼如下:

#include<bits/stdc++.h>
using namespace std;
int n,m,ans=0;
int F[5000][5000];
char a[5000][5000];
inline int Min(int a,int b,int c)
{
    return min(min(a,b),c);
}
int main()
{ 
    freopen("count.in","r",stdin);
    freopen("count.out","w",stdout);
    cin>>n>>m;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            cin>>a[i][j];
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            if (a[i][j]=='1') 
                F[i][j]=Min(F[i-1][j],F[i][j-1],F[i-1][j-1])+1;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++)
            ans+=F[i][j];
    cout<<ans<<endl;
    fclose(stdin);fclose(stdout);
    return 0;
}

矩陣切割

題目描述
給你一個矩陣,其邊長均為整數。你想把矩陣切割成總數最少的正方形,其邊長也為整數。切割工作由一臺切割機器完成,它能沿平行於矩形任一邊的方向,從一邊開始一直切割到另一邊。對得到的矩形再分別進行切割。
輸入格式
輸入檔案中包含兩個正整數,代表矩形的邊長,每邊長均在1—100之間。
輸出格式
輸出檔案包含一行,顯示出你的程式得到的最理想的正方形數目。
樣例資料
input
5 6
output
5

求什麼設什麼,設 F [ i ] [ j ] ( i , j ) 所能組成的最少正方形,那麼必然可以得到初值: F [ i ] [ i ] = 1 ( i = m i n ( n , m ) ) . 同樣,我們應該如何去得到呢, 1... i , 1... j 的矩形其實就是若干個小的矩形矩形得到,因此我們只需要在若干個小矩形和中求最小值即可。即:

相關推薦

演算法 動態規劃

馬攔過河卒 原題傳送門 這一到題目也是比較基礎的動態規劃,也可以理解為是遞推,主要是運用加法原理,思維難度不大。我們要求從 (0,0) ( 0

演算法對於單調棧的重新理解

對於單調棧的重新理解 關於什麼是單調棧和為什麼要用單調棧: 亂頭髮節 地平線 Largest Rectangle in a Histogram 關於什麼是單調棧和為什麼要用單調棧: 單調棧,就是棧中的元

演算法洗牌演算法

1. 問題描述 洗牌演算法是常見的隨機問題;它可以抽象成:得到一個M以內的所有自然數的隨機順序陣列。 常見問題描述: 1.將自然數1 ~ 100隨機插入到一個大小為100的陣列,無重複元素 2. 1 ~ 52張撲克牌重新洗牌 什麼是好的洗牌演算法: 洗牌之後,如果能夠保證

經典問題動態規劃問題:求最長公共子序列LCS

原博地址:http://blog.csdn.net/yysdsyl/article/details/4226630                 http://blog.csdn.net/ljyljyok/article/details/77905681    證明:   

演算法揹包模板或模型

01揹包 有N 件物品和一個容量為V 的揹包。放入第i 件物品耗費的空間 是vi,得到的價值是wi。求解將哪些物品裝入揹包可使價值總和最大。 根據題意,我們便可以設f[i][j]為已經裝了i件物品且最大容量為j得最大價值. 此時,我們就可以列舉i和j進行動

H.264/AVC視訊編解碼技術十、H.264的去塊濾波演算法

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼

習題動態規劃DP:硬幣遊戲 蛋糕

動態規劃DP硬幣蛋糕塔 硬幣 題目描述 農夫約翰的奶牛喜歡玩硬幣遊戲,因此他發明了一種稱為“Xoinc”的兩人硬幣遊戲。 初始時,一個有N(5 <= N <= 2,000)枚硬幣的堆疊放在地

HDU 2255KM演算法模板題+KM演算法 奔小康賺大錢

描述: 奔小康賺大錢 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7453    Accepted S

H.264/AVC視訊編解碼技術十三、幀間預測編碼(1):幀間預測編碼的基本原理

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼的形式操作一遍,才能對視訊壓

H.264/AVC視訊編解碼技術、熵編碼(7):語法元素的CABAC解析

《H.264/AVC視訊編解碼技術詳解》視訊教程已經在“CSDN學院”上線,視訊中詳述了H.264的背景、標準協議和實現,並通過一個實戰工程的形式對H.264的標準進行解析和實現,歡迎觀看! “紙上得來終覺淺,絕知此事要躬行”,只有自己按照標準文件以程式碼的形式操作一遍,才能對視訊壓

圖文scrapy爬蟲與動態頁面——爬取拉勾網職位資訊(1)

5-14更新 注意:目前拉勾網換了json結構,之前是content - result 現在改成了content- positionResult - result,所以大家寫程式碼的時候要特別注意加上

圖文scrapy爬蟲與動態頁面——爬取拉勾網職位資訊(2)

上次挖了一個坑,今天終於填上了,還記得之前我們做的拉勾爬蟲嗎?那時我們實現了一頁的爬取,今天讓我們再接再厲,實現多頁爬取,順便實現職位和公司的關鍵詞搜尋功能。 之前的內容就不再介紹了,不熟悉的請一定要去看之前的文章,程式碼是在之前的基礎上修改的

習題動態規劃:線性DP

最長上升子序列LIS 問題:求一串數字的最長上升自序列 設f[i]為以第i位數字結尾的子序列的最大長度.當我們列舉i時,我們需要從左往右列舉i前面的數字j,若數字j小於數字i則說明數字i可以在以j結尾的序列之後,因此f[j]+1是一種方案數.若沒有比i小的時

海量資料處理演算法總結

【Bloom Filter】Bloom Filter(BF)是一種空間效率很高的隨機資料結構,它利用位陣列很簡潔地表示一個集合,並能判斷一個元素是否屬於這個集合。它是一個判斷元素是否存在集合的快速的概率演算法。Bloom Filter有可能會出現錯誤判斷,但不會漏掉判斷。也就是Bloom Filter判斷元素

圖文HDFS基本原理

合並操作 ear 系統性能 重要 logs 允許 積累 帶寬 文件系統 本文主要詳述了HDFS的組成結構,客戶端上傳下載的過程,以及HDFS的高可用和聯邦HDFS等內容。若有不當之處還請留言指出。 當數據集大小超過一臺獨立的物理計算機的存儲能力時,就有必要對它進行分區,並存

PPT曹歡歡:今日頭條算法原理

智能 mmu sde dib gap 讀書 class 頭條 相關性 【PPT詳解】曹歡歡:今日頭條算法原理 悟空智能科技 4月8日 公眾號後臺回復:“區塊鏈”,獲取區塊鏈報告 公眾號後臺回復:“sq”,進入區塊鏈分享社群 熱文推薦: 1000位專家推薦,20本區塊鏈

考題 4月DP練習賽題解

跑步[Neal Wu, 2007] 奶牛們打算通過鍛鍊來培養自己的運動細胞,作為其中的一員,貝茜選擇的運動方式是每天進行N(1 <= N <= 10,000)分鐘的晨跑。在每分鐘的開始,貝茜會選擇下一分鐘是用來跑步還是休息。貝茜的體力限制了她跑步的距離。更具體地,如果貝茜

習題搜尋

搜尋習題詳解 分數字 流星雨 安全回家 黑洞 分數字 題目描述 現有N件不可區分的物品,將它們分成10份,要求每份在1~3件之間,問有多少種方案,並按字典序輸出所有方案。 輸入格式 一個整數,表示N&l

論文DPED:DSLR-Quality Photos on Mobile Devices with Deep Convolutional Networks

目錄 1.論文概述 2.效果展示 3.網路內容介紹 3.1作者的貢獻 3.2 網路資料 3.3 網路結構 3.4 損失函式 3.4.1顏色損失。 3.4.2紋理損失textures loss。 3.4.3內容損失 content loss。  3

Diary2018-10-20RestTemplate

1.Get請求 第一種:getForEntity getForEntity函式,該方法返回的是ResponseEntity,該物件是SpringHttp請求響應的封裝,其中封裝了Http的幾個重要元素,比如Http請求狀態碼的列舉物件HttpStatus,還有Http的請