记忆化搜索-poj1088、poj1579、poj1163

来源:互联网 发布:查看mysql权限设置 编辑:程序博客网 时间:2024/06/08 11:47

poj1088 滑雪

分析:经典的记忆化搜索,很容易想到用dfs,但是,如果对每一个点都进行dfs,那么就会超时,这里可以利用记忆化搜索,实际就是对dfs的一点剪枝,对于当前的点的搜索,利用前面的点的搜索结果来更新本点出发能下滑的最长距离即可

#include<stdio.h>#include<string.h>#define MAX 101int R,C;int map[MAX][MAX];int flag[MAX][MAX];void Input(){int i,j;memset(flag,0,sizeof(flag));for(i=0;i<R;i++)for(j=0;j<C;j++)scanf("%d",&map[i][j]);}int vis[4][2]={{-1,0},{1,0},{0,-1},{0,1}};int dfs(int x,int y){int max=0;if(flag[x][y]>0)return flag[x][y];for(int i=0;i<4;i++){int a=x+vis[i][0],b=vis[i][1]+y;if(a>=0 && b>=0 && a<R && b<C && map[x][y]>map[a][b]){int t=dfs(a,b);if(max<t)max=t;}}flag[x][y]=max+1;//记忆化搜索关键,结果保存return flag[x][y];}int main(){scanf("%d%d",&R,&C);Input();int ans=0;for(int i=0;i<R;i++)for(int j=0;j<C;j++){int t=dfs(i,j);//选择最大的作为答案if(ans<t)ans=t;}printf("%d\n",ans);return 0;}
poj1579

按照题意构造dfs函数,并且用记忆化搜索(就是标记)

#include<stdio.h>#include<string.h>int flag[21][21][21];int w(int a,int b,int c){if(a<=0 || b<=0 ||c<=0) return 1;if(a>20 || b>20 || c>20)return w(20,20,20);else if(a<b && b<c)  {if(flag[a][b][c]!=0) return flag[a][b][c];else flag[a][b][c]=w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);}else{if(flag[a][b][c]!=0) return flag[a][b][c];elseflag[a][b][c]=w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);}return flag[a][b][c];}int main(){int a,b,c;memset(flag,0,sizeof(flag));while(scanf("%d%d%d",&a,&b,&c),!(a==-1 && b==-1 && c==-1)){printf("w(%d, %d, %d) = %d\n",a,b,c,w(a,b,c));}return 0;}

poj1163 数字三角形

经典的记忆化搜索

#include<stdio.h>#include<string.h>int N;int map[101][101];int dp[101][101];int dfs(int x,int y){if(x==N) return map[x][y];if(dp[x][y]>0) return dp[x][y];int a=dfs(x+1,y);int b=dfs(x+1,y+1);if(a>b) dp[x][y]=map[x][y]+a; //记忆化标记else dp[x][y]=map[x][y]+b;return dp[x][y];/* 等价if(dp[x][y]>0) return dp[x][y];return dp[x][y]=a[x][y]+(x==N? 0:(dfs(x+1,y)>dfs(x+1,y+1) ? dfs(x+1,y):dfs(x+1,y+1)) );*/}int main(){int i,j;while(~scanf("%d",&N)){memset(dp,0,sizeof(dp));for(i=1;i<=N;i++)for(j=1;j<=i;j++)scanf("%d",&map[i][j]);printf("%d\n",dfs(1,1));}return 0;}



原创粉丝点击