poj 1664 DP

来源:互联网 发布:奕乐麻将 嘉兴玩网络 编辑:程序博客网 时间:2024/06/06 01:18

写了三种版本。

第一种:普通版

#include<cstdio>#include<cstring>int dfs(int M,int N){if(N==1||M==0)return 1;if(M>=N)return dfs(M-N,N)+dfs(M,N-1);elsereturn dfs(M,M);}int main(){int T,M,N;scanf("%d",&T);while(T--){scanf("%d%d",&M,&N);        printf("%d\n",dfs(M,N));}}

第二种:记忆化搜索

#include<cstdio>#include<cstring>int dp[16][16];int dfs(int M,int N){if(dp[M][N]!=-1)return dp[M][N];if(N==1||M==0)return dp[M][N]=1;if(M>=N)return dp[M][N]=dfs(M-N,N)+dfs(M,N-1);elsereturn dp[M][N]=dfs(M,M);}int main(){int T,M,N;memset(dp,-1,sizeof(dp));scanf("%d",&T);while(T--){scanf("%d%d",&M,&N);        printf("%d\n",dfs(M,N));}}


第三种:递推

#include<cstdio>#include<cstring>int dp[16][16];int main(){int T,n,m;scanf("%d",&T);memset(dp,0,sizeof(dp));for(int i=1;i<=10;i++){for(int j=1;j<=10;j++){if(i<j)dp[i][j]=dp[i][i];elseif(i==j)dp[i][j]=dp[i][j-1]+1;elsedp[i][j]=dp[i-j][j]+dp[i][j-1];}}while(T--){scanf("%d%d",&n,&m);printf("%d\n",dp[n][m]);}}


0 0
原创粉丝点击