LeetCode 55. Jump Game
阿新 • • 發佈:2018-12-19
首先這是個動態規劃的題……
我竟然一開始用了dfs做……
最後當然是time limit exceeded.
你直接無腦dfs當然可以。
貼下程式碼:
#include <iostream> #include <cstring> #include <cstdio> #include <vector> using namespace std; const int maxn=1e3+5; bool dfs(int i,int len,vector<int>& a){ if(i>=len) return 0; else if(i==len-1) return 1; else if(a[i]==0&&i!=len-1) return 0; else { for(int j=1;j<=a[i];j++){ if(dfs(i+j,len,a)) return 1; else return 0; } } } int main(){ // int b[]={2,3,1,1,4}; int b[]={3,2,1,0,4}; vector<int> a(b,b+5); cout<<dfs(0,a.size(),a)<<endl; }
那我們轉念一想,子問題果然重疊。設f(n)函式表示下標為n的元素是否能達到。
那麼
f(n)=f(上一個元素),狀態轉移方程。
f(0)=true,邊界條件。
同一個元素可以有很多個上一個狀態,這個題比較特殊,我們知道它的起點總是下標為0的元素,那麼我們選擇離0最近的那個元素作為下標為n元素的上一個狀態就好了,用了一點貪心的思想,順便剪枝嘛。f(0)總是true,這個問題可以換一種問法,就是,我們的前一個狀態最終能不能達到f(0)。
AC code:
class Solution { public: bool canJump(vector<int>& a) { int len=a.size(); int goal=len-1; for(int i=len-2;i>=0;i--){ if(i+a[i]>=goal) goal=i; } if(goal==0) return 1; else return 0; } };