1. 程式人生 > >LeetCode 55. Jump Game

LeetCode 55. Jump Game

首先這是個動態規劃的題……

我竟然一開始用了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;
    }
};