首页 > 代码库 > poj1717
poj1717
两次记忆化搜索,第一次找最小的gap,第二次找最少的次数。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int INF = 0x3f3f3f3f;int n,x;int a[1005];int b[1005];int dp[1005][6005];int abs(int a){ return a > 0 ? a : -a;}int dfs(int cur,int gap){ if(dp[cur][gap] != -1) return dp[cur][gap]; if(cur == n) { return dp[cur][gap] = abs(gap); } int x = dfs(cur + 1,gap + a[cur] - b[cur]); int y = dfs(cur + 1,gap + b[cur] - a[cur]); return dp[cur][gap] = min(x, y);}int dfs2(int cur,int gap){ if(dp[cur][gap] != -1) return dp[cur][gap]; if(cur == n) { if(abs(gap) == x) return dp[cur][gap] = 0; return dp[cur][gap] = INF; } int p = dfs2(cur + 1,gap + a[cur] - b[cur]); int q = dfs2(cur + 1,gap + b[cur] - a[cur]) + 1; return dp[cur][gap] = min(p, q); }int main(){ cin >> n; for(int i = 0;i < n;i ++) { scanf("%d%d",&a[i],&b[i]); } memset(dp,-1,sizeof(dp)); x = dfs(0,0); memset(dp,-1,sizeof(dp)); cout << dfs2(0,0) << endl; return 0; }
poj1717
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。