1. 程式人生 > 實用技巧 >記憶化搜尋

記憶化搜尋

題目:

任意輸入一個數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;
}

相信大家看了這篇部落格之後,就可以明白記憶化搜尋的原理了!!!