题目链接:点击打开链接

题意:

一个游戏由3个人轮流玩

每局游戏由当中一名玩家选择一个数字作为開始

目的:获得最小的得分

对于当前玩家 O 。面对 u 这个数字

则他的操作有:

1、 计分 u +1 ,然后 u++;

2、计分 u / x, 然后 u /= x; 当中x为u的因子且x为素数

然后下一个玩家继续上述操作

3个人各操作一次 为1轮

当一轮结束后,若u==1 则游戏结束

每一个人的得分为 他全部计分记录里最小的数字

若在一轮结束前 u就==1, 那么玩家的得分为本局游戏的初始数

求:

每一个人在採取最优操作下玩n局游戏的总得分(不同局得分相加)

输入n表示n局游戏

以下n行给定 人名缩写+u

表示哪个玩家開始,他选择了哪个数字

思路:

1、n局游戏之间各不影响,所以分开考虑每局游戏

2、对于一局游戏。则我们能够记忆化搜索出每一个数字u相应的状态

显然我们能够得到若u为素数时 答案就是 { 1, u, u}

若u不为素数,则u能够转移到状态v

在保证第一个数字最小的情况下,从越小的状态转移过来则结果越小

注意素数初始化时我们觉得是{prime, inf, inf}  这样会得到一些不存在状态,而不存在的状态意义是本局游戏的初值

#include <stdio.h>
#include <algorithm>
#include<iostream>
#include<string.h>
#include <math.h>
#include<queue>
#include<map>
#include<vector>
#include<set>
using namespace std;
#define N 100008
#define inf 100000000
#define ll int
ll prime[9599], primenum;
set<int>s;
void PRIME(ll Max_Prime){
primenum = 0;
prime[primenum++] = 2;
for(ll i = 3; i <= Max_Prime; i+= 2)
for(ll j = 0; j < primenum; j++)
if(i%prime[j]==0)break;
else if(prime[j] > sqrt((double)i) || j==primenum-1)
{
prime[primenum++] = i;
break;
}
}
struct node{
int a,b,c,ok;
node(int x=0,int y=0,int z=0,int yes=0):a(x),b(y),c(z),ok(yes){}
}dp[N];
void dfs(int u){
if(dp[u].ok)return;
int t, fir = inf, id = inf;
for(int i = 0; prime[i] <= u; i++)if(u % prime[i]==0) {
dfs(u/prime[i]);
t = min(u/prime[i], dp[u/prime[i]].c);
if(t < fir || (t == fir && u/prime[i] < id))
fir = t, id = u/prime[i];
}
dfs(u+1);
t = min(u+1, dp[u+1].c);
if(t < fir || (t == fir && u+1 < id))
fir = t, id = u+1;
dp[u] = node( fir, dp[id].a, dp[id].b, true);
}
int main(){
int i, n;
PRIME(100007);
s.clear();
for(i = 0; i < N; i++) dp[i].ok = false;
for(i = 0; i < primenum; i++) {
dp[prime[i]] = node(1, inf, inf, true);
s.insert(prime[i]);
}
dp[1] = node(1, 1, 1, true);
while(~scanf("%d",&n)){
node ans = node(0, 0, 0, true);
while(n--){
char ch[2]; int u;
scanf("%s %d", ch, &u);
dfs(u);
node tmp = dp[u];
if(tmp.a == inf) tmp.a = u;
if(tmp.b == inf) tmp.b = u;
if(tmp.c == inf) tmp.c = u; if(ch[0] == 'O')
ans.a += tmp.a, ans.b += tmp.b, ans.c += tmp.c;
else if(ch[0] == 'E')
ans.b += tmp.a, ans.c += tmp.b, ans.a += tmp.c;
else
ans.c += tmp.a, ans.a += tmp.b, ans.b += tmp.c;
}
printf("%d %d %d\n", ans.a,ans.b, ans.c);
}
return 0;
}

BNU 25593 Prime Time 记忆化dp的更多相关文章

  1. Google Code Jam 2009, Round 1C C. Bribe the Prisoners (记忆化dp)

    Problem In a kingdom there are prison cells (numbered 1 to P) built to form a straight line segment. ...

  2. UVA - 11324 The Largest Clique 强连通缩点+记忆化dp

    题目要求一个最大的弱联通图. 首先对于原图进行强连通缩点,得到新图,这个新图呈链状,类似树结构. 对新图进行记忆化dp,求一条权值最长的链,每一个点的权值就是当前强连通分量点的个数. /* Tarja ...

  3. cf835(预处理 + 记忆化dp)

    题目链接: http://codeforces.com/contest/835/problem/D 题意: 定义 k 度回文串为左半部分和右半部分为 k - 1 度的回文串 . 给出一个字符串 s, ...

  4. cf779D(记忆化dp)

    题目链接: http://codeforces.com/problemset/problem/799/D 题意: 给出两个矩阵边长 a, b, 和 w, h, 以及一个 c 数组, 可选择 c 数组中 ...

  5. Codeforces1107E Vasya and Binary String 记忆化dp

    Codeforces1107E 记忆化dp E. Vasya and Binary String Description: Vasya has a string \(s\) of length \(n ...

  6. POJ 1088 滑雪(简单的记忆化dp)

    题目 又一道可以称之为dp的题目,虽然看了别人的代码,但是我的代码写的还是很挫,,,,,, //看了题解做的简单的记忆化dp #include<stdio.h> #include<a ...

  7. POJ 1088 滑雪 记忆化DP

    滑雪 Time Limit: 1000MS   Memory Limit: 65536K       Description Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度 ...

  8. [luogu]P1514 引水入城[搜索][记忆化][DP]

    [luogu]P1514 引水入城 引水入城 题目描述在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形 ,如下图所示,其中每个格 ...

  9. 记忆化dp博弈

    题:http://poj.org/problem?id=2068 题意: 有两个队伍A,B,每个队伍有N个人,交叉坐.即是A(1,3,5,7.....)B(2,4,6,8....).告诉你每个mi(1 ...

随机推荐

  1. 【Linux】 CentOS免密登录

    #sudo ssh-keygen -t rsa #sudo ssh-copy-id ${ipAddress}

  2. [bzoj4816][Sdoi2017]数字表格 (反演+逆元)

    (真不想做莫比乌斯了) 首先根据题意写出式子 ∏(i=1~n)∏(j=1~m)f[gcd(i,j)] 很明显的f可以预处理出来,解决 根据套路分析,我们可以先枚举gcd(i,j)==d ∏(d=1~n ...

  3. JavaSE-13 内部类

    学习要点 内部类的定义 内部类的应用 内部类 定义 Java的一个类中包含着另一类. A类和B类是C类的外部类.B类是C类的外部类.A类也称为顶层类. 如何使用内部类 public class MyF ...

  4. JavaSE-09 继承

    学习要点 继承的优点和实现 子类重写父类方法 继承下构造方法的执行过程 抽象类和抽象方法的使用 final修饰属性.方法和类 继承的优点和实现 宠物管理系统优化设计 宠物管理系统中的类有什么问题? 使 ...

  5. Chrome插件:微信公众号自动登录(chrome.extension)

    manifest.json: { "manifest_version": 2, "name": "WX.AutoLogin", " ...

  6. js ajax 传送xml dom对象到服务器

    客户端代码 1 <script> var isie = true; var xmlhttp = null; function createXMLHTTP() {//创建XMLXMLHttp ...

  7. Volume 1. String(uva)

    10361 - Automatic Poetry #include <iostream> #include <string> #include <cstdio> # ...

  8. Python之基础练习题

    Python之基础练习题 1.执行 Python 脚本的两种方式 2.简述位.字节的关系 解:8位是一个字节 3.简述 ascii.unicode.utf-8.gbk 的关系 4.请写出 “李杰” 分 ...

  9. 开发调式时生成dump文件

    开发调式时,对程序生成dump文件:1:需要生成的时机,加Thread.sleep(600*1000).2:打开jvisualvm找到该程序进程号.3:jmap.

  10. HTML5中手势原理分析与数学知识的实践

    摘要:在这触控屏的时代,人性化的手势操作已经深入了我们生活的每个部分.现代应用越来越重视与用户的交互及体验,手势是最直接且最为有效的交互方式,一个好的手势交互,能降低用户的使用成本和流程,大大提高了用 ...