給定一個填充非負數的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】【演算法練習】輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為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(