USACO/game1 3.3.5 博弈
来源:互联网 发布:源码商城开发公司 编辑:程序博客网 时间:2024/06/03 17:59
这是一个博弈的问题,第一次做这种题,看了题解的。
最后思想什么的都在代码里的。
#include <stdio.h>#include <stdlib.h>/*dp[i][j]=sum[i][j]-min(dp[i][j-1],dp[i+1][j]);这个原理就是假设先假设取第一个,然后第二个人取的话最大就是dp[i][j-1];假设先取的是最后一个最大就是dp[i+1][j];然后取两者最小的,就是第一个的最优*/int min(int a,int b){ if(a>b) return b; return a;}int main(){ FILE *fin=fopen("game1.in","r"); FILE *fout=fopen("game1.out","w"); int n; int ars[110]={0}; int sum[110][110]={0}; int first[110]={0}; int dp[110][110]={0}; //dp[i][j]表示从第i到j个数先取能得到的最大数之和 int i ,j,f; fscanf(fin,"%d",&n); for(i=1;i<=n;i++) { fscanf(fin,"%d",&ars[i]); first[i]=first[i-1]+ars[i]; dp[i][i]=ars[i]; } for(i=1;i<=n;i++) { for(j=i;j<=n;j++) { sum[i][j]=first[j]-first[i-1]; } } for(f=1;f<=n;f++) //这个我感觉是有点麻烦的,画个递归树 { //然后就知道先求的就是两者的间隔的 for(j=1;j<n;j++) { if(f+j<=n) { dp[j][j+f]=sum[j][j+f]-min(dp[j][j+f-1],dp[j+1][j+f]); } } } fprintf(fout,"%d %d\n",dp[1][n],sum[1][n]-dp[1][n]); return 0;}
- USACO/game1 3.3.5 博弈
- USACO 3.3 A Game (game1)
- usaco 3.3 game1 2008.11.7
- USACO/game1
- usaco --A Game--game1
- usaco 3.3.5(博弈/DP)
- USACO算法系列十八——game1
- abap game1
- python game1
- USACO 3.3.5
- USACO 3.3.5
- USACO 2010 Dec Silver 2.Treasure Chest 简单博弈 DP
- Cogs 763. [USACO Open09] 数字的游戏(博弈)
- bzoj 3298: [USACO 2011Open]cow checkers 威佐夫博弈
- USACO3.3.5 A Game (game1)
- USACO3.3.5 A Game (game1)
- [U]3.3.5 博弈原理,DP实现
- [usaco]单源最短路径:3.3.5 Sweet Butter
- Android之Adapter用法总结
- asp.net利用Ajax和Jquery在前台向后台传参数并返回值
- jquery validate 表单验证
- 黑马程序员-基础IO流(其他流)
- java读取pdf文件
- USACO/game1 3.3.5 博弈
- 关于NULL
- 【谷歌面试题】有序输出两棵二叉查找树中的元素
- 你的手机最近有没有3G问题?
- java 入门 二(基本数据类型与引用数据类型的区别)
- 从"0"开始
- 漫话中文自动分词和语义识别 - 中文分词算法
- 多线程的使用(1) - performSelectorOnMainThread
- spring3mvc与struts2比较