poj2738 dp+递归
2016-03-31 16:12
134 查看
题目意思:对于一列数组,从两端取数字,第一个人取最优,第二个人选取左右边界中最大的数字
注意!!!当相等的时候取左边的( If there is a tie, remove the left end.)
思路:刚开始想到两个左右两端各一个数字进行递归,但是发现第二个人会取一个数字,所以范围扩大,左右各两个数字,这样方便处理数字
然后比对,递归,见下面代码就好了
注意!!!当相等的时候取左边的( If there is a tie, remove the left end.)
思路:刚开始想到两个左右两端各一个数字进行递归,但是发现第二个人会取一个数字,所以范围扩大,左右各两个数字,这样方便处理数字
然后比对,递归,见下面代码就好了
#include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int a[1010],dp[1010][1010]; int ans; int dfs(int f,int r) { if(dp[f][r]!=-1) return dp[f][r]; if(f+1==r) return dp[f][r]=abs(a[f]-a[r]); int temp1,temp2; if(a[f+1]>=a[r]) temp1=dfs(f+2,r)+a[f]-a[f+1]; else temp1=dfs(f+1,r-1)+a[f]-a[r]; if(a[f]>=a[r-1]) temp2=dfs(f+1,r-1)+a[r]-a[f]; else temp2=dfs(f,r-2)+a[r]-a[r-1]; return dp[f][r]=max(temp1,temp2); } int main() { int n,coun=1; while(scanf("%d",&n),n) { memset(dp,-1,sizeof(dp)); for(int i=0;i<n;i++) scanf("%d",&a[i]); printf("In game %d, the greedy strategy might lose by as many as %d points.\n",coun++,dfs(0,n-1)); } return 0; }
相关文章推荐
- 数据结构中的7种排序算法
- Linux常用命令大全
- alert table 增加列,修改列
- 机器学习:核方法和soft svm
- 管理类-项目管理-处事管理
- svn最终搭建
- Hadoop备忘:Reduce阶段Iterable<VALUEIN> values中的每个值都共享一个对象
- UIImage高斯模糊
- Android开发学习笔记:数据存取之SQLite浅析
- 图片加载框架Glide使用详解
- OVS网桥建立和连接管理
- 时间复杂度和空间复杂度详解
- 21个数据科学家面试必须知道的问题和答案
- Rhino -- 基于java的javascript实现
- java Android 中的字符串比较和double类型转换为两位小数点
- Android TextView系列--第一篇
- Mysql分段统计简单数据信息例如年龄,省份,性别等等
- powershell 查看程序的tcp网络连接
- js中关于date()的扩展
- 疑惑,需要解决的问题