สมมติว่ามีหุ่นยนต์อยู่ที่มุมบนซ้ายของตารางขนาด n x m (แถว n และคอลัมน์ m) หุ่นยนต์สามารถเคลื่อนที่ได้ทั้งด้านล่างหรือด้านขวาเมื่อใดก็ได้ หุ่นยนต์ต้องการไปถึงมุมล่างขวาของตาราง (ทำเครื่องหมาย 'END ในแผนภาพด้านล่าง)
มีการทำเครื่องหมายบางช่องในตาราง ซึ่งจะถือเป็นอุปสรรค ดังนั้นเราต้องค้นหาว่ามีเส้นทางที่ไม่ซ้ำกันกี่เส้นทาง? ตัวอย่างเช่น หากเส้นตารางเป็นแบบ [[0,0,0],[0,1,0],[0,0,0]] เส้นตารางจะเป็นแบบด้านล่าง −
หุ่นยนต์ | | |
| Obs | |
| | END |
ผลลัพธ์จะเป็น 2 ดังนั้นจึงมีทั้งหมด 2 วิธีในการเข้าถึงจากตำแหน่งเริ่มต้นไปยังตำแหน่งสิ้นสุด เส้นทางเหล่านี้คือ −
- ขวา → ขวา → ล่าง → ลง
- ลง → ลง → ขวา → ขวา
ให้เราดูขั้นตอน -
- a :=จำนวนแถว b :=จำนวนคอลัมน์
- ถ้า grid[a – 1,b - 1] ไม่ใช่ศูนย์ ให้คืนค่า 0
- สร้างตารางที่มีลำดับ x b และชื่อ DP
- สำหรับ i :=b – 1 เหลือ 0
- ถ้า grid[a – 1, i], แตก, ไม่เช่นนั้น DP[a – 1, i] :=1
- for i :=a – 1 down to 0
- ถ้า grid[i, b - 1] แตก มิฉะนั้น DP[i, b – 1] :=1
- for i :=a – 2 down to 0
- สำหรับ j :=b – 2 เหลือ 0
- DP[i, j] :=DP[i + 1, j] + DP[i, j + 1] เมื่อ grid[i, j] เป็น 0 มิฉะนั้น 0
- สำหรับ j :=b – 2 เหลือ 0
- คืน DP[0, 0]
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; typedef long long int lli; class Solution { public: int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) { int a = obstacleGrid.size(); int b = obstacleGrid[0].size(); if(!a || !b) return 0; if(obstacleGrid[a - 1][b - 1])return 0; vector < vector <lli> > dp(a, vector <lli>(b)); for(int i = b - 1; i >= 0; i--)if(obstacleGrid[a-1][i]) break; else dp[a-1][i] = 1; for(int i = a - 1; i >= 0; i--)if(obstacleGrid[i][b - 1]) break; else dp[i][b-1] = 1 ; for(int i = a-2; i >= 0; i--){ for(int j = b-2 ; j >= 0; j--)dp[i][j] = !obstacleGrid[i][j]? dp[i+1][j] + dp[i][j+1] : 0; } return dp[0][0]; } }; main(){ Solution ob; vector<vector<int>> v = {{0,0,0},{0,1,0},{0,0,0}}; cout << ob.uniquePathsWithObstacles(v); }
อินพุต
[[0,0,0],[0,1,0],[0,0,0]]
ผลลัพธ์
2