行列で表される島があります。あなたは島のどこかにいます(x,y)
。あなたがn
時間をジャンプする場合、あなたが生き残る確率はどれくらいですか?サバイバルとは、n
ジャンプした後、島にいる必要があることを意味します。
私の解決策:flood fill algorithm
すべての方向(つまり、N、W、E、S)に移動できるように適用し、n
ジャンプする前に島を離れているかどうかを確認してから、 failure
カウンターをインクリメントします。それ以外の場合は、success
カウンターをインクリメントします。
考えられるすべてのパスを繰り返した後、答えは((成功)/(成功+失敗))です。指数関数的な時間がかかります。
あなたからの私の質問は、動的計画法または他のプログラミング手法を使用して、この問題を多項式時間で実行できるかどうかです。もしそうなら、そのテクニックの背後にあるコンセプトを教えていただけますか?
編集:私のコード
#include<iostream>
using namespace std;
double probability_of_survival(int n, int m, int x, int y, int jumps) {
int success = 0;
int failure = 0;
probability_of_survival_utility_func(n, m, x, y, 0, jumps, &sucess, &failure);
return (double)((success)/(failure+success));
}
void probability_of_survival_utility_func(int n, int m, int x, int y, int jump_made, int jumps, int *success, int *failure) {
if(x > m || x < 0 || y > n || y < 0) { (*failure)++; return;}
if(jump_made == jumps) { (*success)++; return;}
probability_of_survival_utility_func(n, m, x+1, y, jump_made++, jumps, success, failure);
probability_of_survival_utility_func(n, m, x, y+1, jump_made++, jumps, success, failure);
probability_of_survival_utility_func(n, m, x-1, y, jump_made++, jumps, success, failure);
probability_of_survival_utility_func(n, m, x, y-1, jump_made++, jumps, success, failure);
}