dp(x)表示前x个的最大值,  Max(x)表示含有因数x的dp最大值. 然后对第x个数a[x], 分解质因数然后dp(x) = max{Max(t)} + 1, t是x的因数且t>=L ----------------------------------------------------------------------------------------- #include<cstdio> #include<cmath> #include<cstring>…
1978: [BeiJing2010]取数游戏 game Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 650  Solved: 400[Submit][Status] Description 小 C 刚学了辗转相除法,正不亦乐乎,这小 P 又出来捣乱,给小 C 留了个 难题. 给 N 个数,用 a1,a2…an来表示.现在小 P 让小 C 依次取数,第一个数可以 随意取.假使目前取得 aj,下一个数取ak(k>j),则ak必须满足gcd(aj,a…
取数游戏 game bzoj-1978 BeiJing-2010 题目大意:给定一个$n$个数的$a$序列,要求取出$k$个数.假设目前取出的数是$a_j$,那么下次取出的$a_k$必须保证:$j<k$且$gcd(a_j,a_k)/reL$.问最多能取出多少个数. 注释:$1\le n\le 5\cdot 10^4$,$2\le L \le a_i\le 10^6$. 想法: 显然可以用动态规划解决. 状态:$dp_i$表示强制选第$i$个数,前$i$个数中最多能取多少个数. 转移是$O(n^2…
1166 矩阵取数游戏 2007年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description [问题描述]帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m 的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下:1. 每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素:2. 每次取走的各个元素只能是该元素所在行的行首或行尾:3. 每次取数都有一个得分值,为每行取数的得分之…
题目链接 取数游戏 思路:dp(x, y)表示先手在区间[x, y]能取得的最大分数.当先手取完,就轮到后手去,后手一定会选择当前能令他得到最大分数的策略,其实当先手在[x, y]区间两端取走一个数,那么后手面临两个状态[x+1, y]和[x, y-1],先手想要取得最大值,一定会想让后手取这两种状态中的较小值,设[x, y]区间的数字和为sum,转移方程就是dp(x, y) = max{sum - dp(x+1, y), dp(x, y-1)}.边界就是只有一个数的时候,即x==y. 关于博弈…
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j​均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共nn个.经过mm次后取完矩阵内所有元素: 每次取走的各个元素只能是该元素所在行的行首或行尾: 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值\times 2^i×2i,其中ii表示第ii次取数(从11开始编号): 游戏结束总得分为mm次取数得分之和. 帅帅想请你帮忙写…
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的\(m*n\)的矩阵,矩阵中的每个元素\(a_{i,j}\)均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n个.经过m次后取完矩阵内所有元素: 每次取走的各个元素只能是该元素所在行的行首或行尾: 每次取数都有一个得分值,为每行取数的得分之和,每行取数的得分 = 被取走的元素值\(\times 2^i\)*,其中i表示第i次取数(从1开始编号): 游戏结束总得分为m次取数得分之和. 帅帅想请你帮忙写一个程序,对于任意矩阵…
有如下一个双人游戏:N个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,每次有数字被一个玩家取走后,这个数字被从序列中去掉并累加到取走该数的玩家的得分中,当数取尽时,游戏结束.以最终得分多者为胜. 编一个执行最优策略的程序,最优策略就是使自己能得到在当前情况下最大的可能的总分的策略.你的程序要始终为两位玩家执行最优策略. 行包括一个正整数N(2≤N≤100), 表示序列中正整数的个数.输入第2行包含用空格分隔的N个正整数(1≤所有正整数≤200). 只有一行,用空格分隔的两个整数: 依…
题意:从自然数1到N中不取相邻2数地取走任意个数,问方案数. 解法:f[i][1]表示在前i个数中选了第i个的方案数,f[i][0]表示没有选第i个.f[i][1]=f[i-1][0];  f[i][0]=f[i-1][1]+f[i-1][0] 而若简化方程式,用f[i]表示从前i个中取数的方案数.便是f[i]=f[i-2]+f[i-1],斐波拉契的递推式.推导过程如下:若用x,y,f[i-2]表示f[i-2][1],f[i-2][1],f[i-2][1]+f[i-2][0],xx,yy,f[i…
不大难的dp,暴力拆一下约数然后按照约数来统计即可. 注意:vector 很慢,所以一定特判一下,如果没有该数,就不要添加. Code: #include <bits/stdc++.h> #define N 1000005 #define setIO(s) freopen(s".in","r",stdin) using namespace std; vector<int>v[N]; int prime[N],f[N],g[N],A[N]; b…