1. 程式人生 > >給定一個填充非負數的m×n網格,找到一條從左上到右下的路徑,這個路徑將所有數字的總和最小化。

給定一個填充非負數的m×n網格,找到一條從左上到右下的路徑,這個路徑將所有數字的總和最小化。

本題源自leetcode  64

-------------------------------------------------------------------

思路 : 動態規劃

1 用一個二維陣列dp[i][j]記錄到達 i,j 所需要的最小路徑和。考慮邊界條件。

2 優化 :用一個一維陣列來記錄到達某一列,需要的最小路徑和。

程式碼:

 int minPathSum(vector<vector<int>>& grid) {
        /*
        int row = grid.size();
        if(row == 0)
            return 0;
        int col =  grid[0].size();
        if(col == 0)
            return 0;
        vector<vector<int>> dp(row,vector<int>(col,0));
        dp[0][0] = grid[0][0];
        for(int i = 1; i < row; i++)
            dp[i][0] = dp[i-1][0] + grid[i][0];
        for(int i = 1; i < col; i++)
            dp[0][i] = dp[0][i-1] + grid[0][i];
        for(int i = 1; i < row; i++)
            for(int j = 1; j < col; j++)
                dp[i][j] = min(dp[i-1][j], dp[i][j-1])+grid[i][j];
        return dp[row-1][col-1];
        */
        int row = grid.size(), col = grid[0].size();
        vector<int> dp(col,0);
        dp[0] = grid[0][0];
        for(int j = 1; j < col; j++)
            dp[j] = dp[j - 1] + grid[0][j];
        for(int i = 1; i < row; i++){
            dp[0] += grid[i][0];
            for(int j = 1; j < col; j++)
                dp[j] = min(dp[j - 1],dp[j]) + grid[i][j];
        }
        return dp[col - 1];
    }


相關推薦

給定一個填充負數m×n網格找到左上右下路徑這個路徑所有數字總和

本題源自leetcode  64 ------------------------------------------------------------------- 思路 : 動態規劃 1 用一個二維陣列dp[i][j]記錄到達 i,j 所需要的最小路徑和。考慮邊界條件

輸入一個正整數陣列把數組裡所有數字拼接起來排成個數 列印能拼接出的所有數字一個例如輸入{3,32,321,4}則列印數字是 3213234

public class FandMax { public void makeMax(int[] nums){ boolean flag=true; for (int i = 0; i < nums.length; i++) { for (int j = 0; j <

【Java】【演算法練習】輸入一個正整數陣列把數組裡所有數字拼接起來排成個數列印能拼接出的所有數字最小一個。例如輸入陣列{332321}則打印出這三個數字能排成的最小數字為321323

題目描述:         輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列 {3,32,321},則打印出這三個數字能排成的最小數字為321323。 解題思路:        解題思路: 比較兩個字串s1 S2的

輸入一個正整數數組把數組裏所有數字拼接起來排成個數打印能拼接出所有數字一個

style void ole min 一個數 string right public [] 題目: 輸入一個正整數數組,把數組裏所有數字拼接起來排成一個數。打印能拼接出所有數字中最小的一個。 解答: 1 public class Solution { 2 3

【DP】在矩陣中選擇左上角到右下角、經過數字之和大的路徑

題目:EPI int max_fishing(vector<vector<int>> A) { if (A.empty() || A[0].empty()) throw new exception; for (int i = 0; i &l

GCD的簡單使用開闢新的執行緒讓上面的任務序列執行

// 1.獲得全域性的併發佇列     dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);     // 2.將任務加入佇列     dispatch_async(queue

個數組開始的若干個元素搬到陣列的末尾我們稱之為陣列的旋轉 輸入一個減排序的陣列的一個旋轉輸出旋轉陣列的元素

題目描述 把一個數組最開始的若干個元素搬到陣列的末尾,我們稱之為陣列的旋轉。 輸入一個非減排序的陣列的一個旋轉,輸出旋轉陣列的最小元素。 例如陣列{3,4,5,1,2}為{1,2,3,4,5}的一個旋轉,該陣列的最小值為1。 NOTE:給出的所有元素都大於0,若陣列大小為0,請返回0。 /*

給定一個正整數n找到比n的完美平方數相加和等於n的數目

  本題源自leetcode ---------------------------------------------------------------- 思路: 動態規劃。用一個vector儲存整數 i 需要的最小平方和數。 1 初始化一個vector. v[0]=0

給定一個只包含小寫字母的字串刪除重複的字母每個字母只出現所有結果中輸出字典順序

本題源自leetcode 316 --------------------------------------------------------------------------------- 思路:1 用倆個vector 標記字元在串中的出現的次數,以及這個字元是否訪

設計一個演算法通過趟遍歷確定長度為n的單鏈表中值大的結點

語言:C++ #include <iostream> using namespace std; typedef int Elemtype; typedef struct LNode { Elemtype data; struct LNode *next; }LNode,*Lin

給出一個m*n的矩陣求左上角到右下角的距離的

問題描述 這是一個商湯科技筆試題的變形,大致是給出一個m*n的矩陣,矩陣裡的數代表其他相鄰格到此格的距離,且只能向右和向下走,求左上角到右下角的距離的最小值。 例: 0 1 9 3 5 2 6 8 7 這個例子的最短距離是0-1-5-2-7,結果是15。 這個真

java--建立一個帶預設構造方法(即無參構造)的類在構造方法中列印訊息"Hello Constructor";再為這個類新增一個過載構造方法令其接收一個字串引數其一起打印出來

題目描述:建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 //Perso

處理流程已辦完選擇一個節點新增待辦

---找到流程例項id--- select * from ACT_HI_PROCINST t where t.proc_inst_id_ in (select distinct t.proc_inst_id_ from ACT_HI_VARINST t where t.text_='402880e864

Java之建立一個帶預設構造方法(即無參構造)的類在構造方法中列印訊息"Hello Constructor";再為這個類新增一個過載構造方法令其接收一個字串引數

建立一個帶預設構造方法(即無參構造)的類,在構造方法中列印一條訊息"Hello Constructor";再為這個類新增一個過載構造方法,令其接收一個字串引數,並在這個有參構造方法中把"Hello Constructor"和接收的引數一起打印出來。 效果如下: 附上程

在VS裡建立Windows窗體讓其在系統托盤並顯示一個Icon圖示

C#實現系統托盤,C#窗體最小化時隱藏為工作列圖示的Window appllication 1.設定窗體屬性showintask=false   2.加notifyicon控制元件notifyicon1,為控制元件notifyicon1的屬性icon新增一個icon圖示。

在mfc中如何設定一個隱藏選單欄工具欄狀態列最大化、、關閉按鈕的窗體 分類: MFC

int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct) {  if (CFrameWnd::OnCreate(lpCreateStruct) == -1)   return -1;  // 去掉標題欄  /*  i

【演算法】給定個數組除了個數出現1次之外其餘數都出現3次輸出出現次的那個數

給定一個數組,除了一個數出現1次之外,其餘數都出現3次。找出出現一次的數。如:{1, 2, 1, 2, 1, 2, 7},找出7.格式:第一行輸入一個數n,代表陣列的長度,接下來一行輸入陣列A[n],(輸入的陣列必須滿足問題描述的要求),最後輸出只出現一次的數。

*(5)輸入互不相同的組整數構造棵二叉排序樹要求: ① 按遞減有序的順序輸出; ② 輸入一個整數查詢該整數是否在該二叉排序樹中查詢成功返回1否則返回0; ③ 在②中若查詢成功該結

/*(5)輸入互不相同的一組整數,構造一棵二叉排序樹,要求: ① 按遞減有序的順序輸出; ② 輸入一個整數,查詢該整數是否在該二叉排序樹中,查詢成功返回1,否則返回0; ③ 在②中,若查詢成功,則將該結點從二叉排序樹中刪除。 */ #include<stdio.h&g

Java——給定一個字串,判斷該字串中是否包含某個子串.如果包含,求出子串的所有出現位置.

引入包:import java.util.Scanner;main函式:public static void main(String[] args){Scanner s = new Scanner(System.in);System.out.println("請輸入字串");

一個臺階總共有n級如果次可以跳1級也可以跳2級 求總共有多少總跳法並分析演算法的時間複雜度

一個臺階總共有n級,如果一次可以跳1級,也可以跳2級。 求總共有多少總跳法,並分析演算法的時間複雜度。 設:總共有F(n)種跳法 那麼, F(1) = 1; F(2)= 2; F(