記憶化搜尋
阿新 • • 發佈:2020-07-17
題目:
任意輸入一個數n(0<n<1000),然後在輸入n個數進去,請問能夠找到幾對互質的數?
題目分析:
這個題我們可以用記憶化搜尋的方法A掉,下面引用百度的一點東西,讓我們大概瞭解一下這是什麼東西:
** 記憶化搜尋 (Memory search)心理學是指搜尋資訊的流程,但是搜尋到的一些解用動態規劃的那種思想和模式作一些儲存。**
說簡單一點就是,我們可以記錄一下我們以前搜尋過的資訊,這樣以後就不用重複的遞迴,來找取答案了,相信大家都應該已經懂了!
下面上一個程式碼:
memory儲存的是當前已經搜尋過記錄的資訊:
演算法分析:
這裡找兩個數是否互質,只要把大的對小的取餘,重複這樣的動作,如果他們互質那麼就餘1,若不是互質則餘0,(在程式碼中因為初始化資訊都是0,所以這裡不能標記又為0只能標記成不一樣的數,所以就標記成2!!!)
#include<bits/stdc++.h> using namespace std; struct number{ int big,small; }ber; int num[1005],n,memory[1005][1005],ans; int Memory_search(int a,int b){ if(memory[a][b]==1) return 1; else if(memory[a][b]==2) return 2; else if(a==1||b==1) return memory[a][b]=1;//可以這樣return 學習了!!! else if(a==0||b==0) return memory[a][b]=2; else return p[a][b]=Memory_search(b,a%b); } int main() { int a,b,e,i,j; scanf("%d",&n); for(i=1;i<=n;++i) scanf("%d",&num[i]); for(i=1;i<=n;++i) for(j=i+1;j<=n;++j){ b=num[i]<num[j]?num[i]:num[j]; a=num[i]>num[j]?num[i]:num[j]; e=Memory_search(a,b); } printf("%d",ans); return 0; }
相信大家看了這篇部落格之後,就可以明白記憶化搜尋的原理了!!!