P4411


一道dp


f[i]表示一定选第i个数的条件下前i个数所能得到的最优值

last[i]表示质因数i在数列a中最后出现时的下标

状态转移方程为\(f[i]=max\{f[last[j]\:|\: j|i \}+1\)

复杂度\(O(n\sqrt{a_i})\)


#include <bits/stdc++.h>
using namespace std;
int n,l,ans,a[50005],last[1000005],f[50005];
signed main(){
scanf("%d%d",&n,&l);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
int SQRT=sqrt(a[i]); //循环外先算出,提高效率
for(int j=1;j<=SQRT;j++)if(a[i]%j==0){
int x=j,y=a[i]/j; //x,y是a[i]的一组因数
if(x>=l) f[i]=max(f[i],f[last[x]]+1); //由上一个有相同质因数的数转移得到
if(y>=l) f[i]=max(f[i],f[last[y]]+1);
last[x]=last[y]=i; //修改质因数的最后出现下标
}
ans=max(ans,f[i]); //保存最优解
}
printf("%d",ans);
}

P4411&&BZOJ1978 [BJWC2010]取数游戏(动态规划dp)的更多相关文章

  1. luogu 4411 [BJWC2010]取数游戏 约数+dp

    不大难的dp,暴力拆一下约数然后按照约数来统计即可. 注意:vector 很慢,所以一定特判一下,如果没有该数,就不要添加. Code: #include <bits/stdc++.h> ...

  2. [bzoj1978][BeiJing2010]取数游戏 game_动态规划_质因数分解

    取数游戏 game bzoj-1978 BeiJing-2010 题目大意:给定一个$n$个数的$a$序列,要求取出$k$个数.假设目前取出的数是$a_j$,那么下次取出的$a_k$必须保证:$j&l ...

  3. 1166 矩阵取数游戏[区间dp+高精度]

    1166 矩阵取数游戏 2007年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解       题目描述 Description [ ...

  4. BZOJ1978: [BeiJing2010]取数游戏 game

    1978: [BeiJing2010]取数游戏 game Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 650  Solved: 400[Submit] ...

  5. BZOJ 1978: [BeiJing2010]取数游戏 game( dp )

    dp(x)表示前x个的最大值,  Max(x)表示含有因数x的dp最大值. 然后对第x个数a[x], 分解质因数然后dp(x) = max{Max(t)} + 1, t是x的因数且t>=L -- ...

  6. 计蒜客 取数游戏 博弈+dp

    题目链接 取数游戏 思路:dp(x, y)表示先手在区间[x, y]能取得的最大分数.当先手取完,就轮到后手去,后手一定会选择当前能令他得到最大分数的策略,其实当先手在[x, y]区间两端取走一个数, ...

  7. P1005 矩阵取数游戏 区间dp 高精度

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n \times mn×m的矩阵,矩阵中的每个元素a_{i,j}ai,j​均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n ...

  8. P1005 矩阵取数游戏[区间dp]

    题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的\(m*n\)的矩阵,矩阵中的每个元素\(a_{i,j}\)均为非负整数.游戏规则如下: 每次取数时须从每行各取走一个元素,共n个.经过m次后 ...

  9. 计蒜客 取数游戏(dp)

    有如下一个双人游戏:N个正整数的序列放在一个游戏平台上,两人轮流从序列的两端取数,每次有数字被一个玩家取走后,这个数字被从序列中去掉并累加到取走该数的玩家的得分中,当数取尽时,游戏结束.以最终得分多者 ...

随机推荐

  1. 【JZOJ5430】【NOIP2017提高A组集训10.27】图

    题目 有一个n个点的无向图,给出m条边,每条边的信息形如\(<x,y,c,r>\) 给出q组询问形如\(<u,v,l,r>\) 接下来解释询问以及边的意义 询问表示,一开始你在 ...

  2. 【leetcode】1248. Count Number of Nice Subarrays

    题目如下: Given an array of integers nums and an integer k. A subarray is called nice if there are k odd ...

  3. C# 4.0

    序言 动态绑定-dynamic class Program { static void Main(string[] args) { ; ; // Rest the mouse pointer over ...

  4. cmake 简单操作

    实例一: main.c #include <stdio.h> int main( int argc, char *argv[] ) { printf("hello cmake!\ ...

  5. 「POI 2010」Bridges

    题目链接 戳我 \(Solution\) 看到"最大值最小",就知道应该要二分 二分之后,对于每个\(mid\),只要计算小于\(mid\)的边,然后在剩下的图中判断有无欧拉回路 ...

  6. httpclient+jsoup实现网页信息抓取

    需求分析:抓取:http://tools.2345.com/rili.htm中的万年历(阳历.阴历等等). 1.首先为抓取的内容创建一个类.实现封装. package com.wan.domain; ...

  7. java 判断Map集合中包含指定的键名,则返回true,否则返回false。

    public static void main(String[] args) { Map map = new HashMap(); //定义Map对象 map.put("apple" ...

  8. Java基础教程免费分享

    这是我自己早前听课时整理的Java全套知识,适用于初学者,也可以适用于中级进阶的人,你们可以下载,我认为是比较系统全面的,可以抵得上市场上90%的学习资料.讨厌那些随便乱写的资料还有拿出来卖钱的人!在 ...

  9. 191024DjangoORM之单表操作

    一.ORM基础 ORM:object relation mapping 对象关系映射表 1.配置连接MySQL settings.py:将默认配置删除,加入以下配置 DATABASES = { 'de ...

  10. UTC日期转时间戳

    网上的方法用mktime来转换日期到时间戳,会被当前环境的时区影响,现在这么做,用UTC的日期转时间戳这样要转换各地的时区也简单 unsigned long utcMktime(const unsig ...