ACdream 1092 EOF女神的打地鼠游戏 —— dp
来源:互联网 发布:怎样搜索淘宝内衣晒图 编辑:程序博客网 时间:2024/05/07 03:23
题目链接:http://acdream.info/problem?pid=1092
题解:
基础dp,首先要根据每个地鼠出现的时间对他们排序,然后就可以递推,递归(记忆化搜索)。
递推:
#include<iostream>//ACdream - 1092 dp 递推#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#define MAX(a,b) (a>b?a:b)using namespace std;typedef long long LL;int n,v;double dp[1005], ans;struct node{ int x,y,t; double r;}m[1005];bool cmp(node a, node b){ return a.t<b.t;}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&v); for(int i = 0; i<n; i++) scanf("%d%d%d%lf",&m[i].x, &m[i].y, &m[i].t,&m[i].r ); sort(m,m+n,cmp); ans = 0; memset(dp,0,sizeof(dp)); for(int i = 0; i<n; i++) { dp[i] = m[i].r; for(int j = 0; j<i; j++) { double dis1 = sqrt( (m[i].x-m[j].x)*(m[i].x-m[j].x) + (m[i].y-m[j].y)*(m[i].y-m[j].y) ); double dis2 = 1.0*v*(m[i].t-m[j].t); if(dis2>=dis1) dp[i] = MAX(dp[i],m[i].r+dp[j]); } ans = MAX(dp[i],ans); } printf("%.6lf\n",ans); } return 0;}
递归(正向,跟递推一样)
#include<iostream>//ACdream - 1092#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#include<algorithm>#define MAX(a,b) (a>b?a:b)using namespace std;typedef long long LL;int n,v;double dp[1005], ans;struct node{ int x,y,t; double r;}m[1005];bool cmp(node a, node b){ return a.t<b.t;}double dfs(int k){ if(dp[k]) return dp[k]; dp[k] = m[k].r; for(int i = 0; i<k; i++) { double dis1 = sqrt( (m[k].x-m[i].x)*(m[k].x-m[i].x) + (m[k].y-m[i].y)*(m[k].y-m[i].y) ); double dis2 = 1.0*v*(m[k].t-m[i].t); if(dis2>=dis1) dp[k] = MAX(dp[k],dfs(i)+m[k].r); } return dp[k];}int main(){ int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&v); for(int i = 0; i<n; i++) scanf("%d%d%d%lf",&m[i].x, &m[i].y, &m[i].t,&m[i].r ); sort(m,m+n,cmp); ans = 0; memset(dp,0,sizeof(dp)); for(int i = 0; i<n; i++) { ans = MAX(ans,dfs(i)); } printf("%.6lf\n",ans); }}
递归(反向):
#include<iostream>//ACdream - 1092 dp 递归 #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #define MAX(a,b) (a>b?a:b) using namespace std; typedef long long LL; int n,v; double dp[1005], ans; struct node { int x,y,t; double r; }m[1005]; bool cmp(node a, node b) { return a.t<b.t; } double dfs(int k) { if(dp[k]) return dp[k]; dp[k] = m[k].r; for(int i = k+1; i<n; i++) { double dis1 = sqrt( (m[k].x-m[i].x)*(m[k].x-m[i].x) + (m[k].y-m[i].y)*(m[k].y-m[i].y) ); double dis2 = 1.0*v*(m[i].t-m[k].t); if(dis2>=dis1) dp[k] = MAX(dp[k],dfs(i)+m[k].r); } return dp[k]; } int main() { int T; scanf("%d",&T); while(T--) { scanf("%d%d",&n,&v); for(int i = 0; i<n; i++) scanf("%d%d%d%lf",&m[i].x, &m[i].y, &m[i].t,&m[i].r ); sort(m,m+n,cmp); ans = 0; memset(dp,0,sizeof(dp)); for(int i = 0; i<n; i++) { if(!dp[i]) ans = MAX(ans,dfs(i)); } printf("%.6lf\n",ans); } }
0 0
- acdream 1092 EOF女神的打地鼠游戏 (概率dp)
- ACdream 1092 EOF女神的打地鼠游戏 —— dp
- ACdream1092-EOF女神的打地鼠游戏
- Acdream 1095 EOF女神的相反数
- ACdream 1095 EOF女神的相反数(数学:二进制处理)
- 打地鼠 简单的游戏
- 简单的打地鼠游戏
- 简单的打地鼠游戏
- Android游戏开发————打地鼠
- HDOJ4540 威威猫系列故事——打地鼠 【DP】
- hdu4540 - 威威猫系列故事——打地鼠 (经典dp)
- hdu 4540 威威猫系列故事——打地鼠 dp
- hdoj4540威威猫系列故事——打地鼠【dp】
- hdu 4540 威威猫系列故事——打地鼠(DP)
- hdu4540 威威猫系列故事——打地鼠 (dp)
- JavaScript案例——打地鼠游戏及其实现
- 我的第一个HTML5游戏——打地鼠总结…
- 我的第一个HTML5游戏——打地鼠具体…
- oracle查询当前用户名下所有表
- 100个替代昂贵商业软件的开源应用/100 Open Source Replacements for Expensive Applications
- 用dbforge调试procedure
- 格式化参数格式化成url参数
- Android 自动化测试所需环境搭建
- ACdream 1092 EOF女神的打地鼠游戏 —— dp
- 关于MyEclipse的破解以及软件的下载
- 树状数组求逆序对
- InnoDB与Myisam的六大区别
- <meta charset="gbk">或者<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">乱码
- compass入门
- Cookie 和 Session机制详解
- 生成签名
- 欢迎使用CSDN-markdown编辑器