首页 > 其他分享 >洛谷题单指南-动态规划2-P4933 大师

洛谷题单指南-动态规划2-P4933 大师

时间:2024-04-25 11:33:34浏览次数:23  
标签:指南 const int 洛谷题 公差 P4933 dp 20000 等差数列

原题链接:https://www.luogu.com.cn/problem/P4933

题意解读:求有多少个子序列可以组成等差序列

解题思路:

1、暴力DFS

如果实在想不出动规的方法,对于n<=20的数据,可以DFS枚举所有子序列的子集,再判断是否是等差数列。

30分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1000, MOD = 998244353;
int h[N], n, ans;
int a[N], b[N]; //a对应的h选则填1,不选则填0;b存选中的数

void dfs(int k)
{
    if(k > n)
    {
        //判断是否是等差数列
        int cnt = 0;
        for(int i = 1; i <= n; i++)
        {
            if(a[i]) b[++cnt] = h[i];
        }
        if(cnt == 0) return;
        if(cnt == 1 || cnt == 2) ans = (ans + 1) % MOD;
        else
        {
            for(int i = 3; i <= cnt; i++)
            {
                if(b[i] - b[i-1] != b[i-1] - b[i-2]) return;
            }
            ans = (ans + 1) % MOD;
        }
        
        return;
    }
    
    for(int i = 0; i <= 1; i++) //第k个可以选或者不选
    {
        a[k] = i;
        dfs(k + 1);
    }
}

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> h[i];
    dfs(1);
    cout << ans;

    return 0;
}

2、动态规划1

设dp[i][j]表示以i,j为最后两位的等差数列个数,状态如何转移?

枚举i前面的所有k,只要h[i]-h[k] == h[j]-h[i],则可以从dp[k][i]转移到dp[i][j],dp[i][j] += dp[k][i]即可,注意取模

对于dp[][]的初始化,对于每一对dp[i][j],初始值都dp[i][j]=1,也就是两个数也是一组等差数列

把所有dp[i][j]加起来即可,另外因为一个数也是等差数列,答案再加上n

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1000, MOD = 998244353;
int h[N], n, ans;
int dp[N][N]; //dp[i][j]表示以i,j为最后两位的等差数列个数

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> h[i];

    for(int j = 2; j <= n; j++)
    {
        for(int i = 1; i < j; i++)
        {
            dp[i][j] = 1;  //i,j组成的两位序列也是一个等差序列
            for(int k = 1; k < i; k++)
            {
                if(h[i] - h[k] == h[j] - h[i]) 
                    dp[i][j] = (dp[i][j] + dp[k][i]) % MOD;
            }
            ans = (ans + dp[i][j]) % MOD;
        }
    }
    ans = (ans + n) % MOD; //加上长度为1的序列个数
    cout << ans;

    return 0;
}

3、动态规划2

设dp[i][j]表示以i结尾,公差为j的等差数列个数,状态如何转移?

枚举i前面的所有k,计算公差h[i]-h[k],直接基于公差h[i]-h[k]进行转移dp[i][h[i]-h[k]] += dp[k][h[i]-h[k]]

由于公差可能为负数,塔高1~20000,h[i]-h[k]要加上20000可以确保正数:dp[i][h[i]-h[k]+20000] += dp[k][h[i]-h[k]+20000]

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 1005, V = 20000, M = 40005, MOD = 998244353;
int h[N], n, ans;
int dp[N][M]; //dp[i][j]表示以i结尾,公差为j的等差数列个数,状态如何转移?

int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> h[i];

    for(int i = 2; i <= n; i++)
    {
        for(int k = 1; k < i; k++)
        {
            dp[i][h[i] - h[k] + V] += dp[k][h[i] - h[k] + V] + 1; //k,i两个数也可以组成一个等差数列,所以要加上1
            dp[i][h[i] - h[k] + V] %= MOD;
        }
    }
    for(int i = 2; i <= n; i++)
    {
        for(int j = 1; j <= M; j++)
        {
            ans = (ans + dp[i][j]) % MOD;
        }
    }
    ans = (ans + n) % MOD;
    cout << ans;

    return 0;
}

 

标签:指南,const,int,洛谷题,公差,P4933,dp,20000,等差数列
From: https://www.cnblogs.com/jcwy/p/18157258

相关文章

  • Rabbit安装指南
    单机部署1、下载镜像方式一:在线拉取dockerpullrabbitmq:3-management方式二:从本地D:\lmdownload\mq.tar加载上传到虚拟机中后,使用命令加载镜像即可:dockerload-imq.tar2、安装执行下面的命令来运行MQ容器:dockerrun\-eRABBITMQ_DEFAULT_USER=root\-eRABBIT......
  • 洛谷题单指南-动态规划2-P1725 琪露诺
    原题链接:https://www.luogu.com.cn/problem/P1725题意解读:走过一系列格子之后,冰冻指数之和最大,相当于计算最大子序列的和。解题思路:设a[0~n]保存所有冰冻指数设dp[i]表示以第i号格子为终点所能获得的最大冰冻指数设j表示i的前一个格子,也就是从j可以移动到i已知i,则j的范围也......
  • npm命令完整使用指南
    前言在我们的工作中,npm是我们会经常使用到的工具,比如我们在App自动化测试中使用到的appium,就是通过npm命令来安装的。但是有许多人表示,自己并不清楚npm命令的使用,本文就给大家介绍一下npm命令的使用。安装配置在我们安装配置好node.js之后,npm也是配置好的,无需我们再进行安装,我......
  • 探索性测试:指南针测试、卖点测试,极限测试等
    指南针测试法“指南针”作用在于为航行者辨别方向。对于测试人员来说,使用指南针测试法可以快速地找到新待测项目的测试切入点。这些“指南针”可以包括:使用手册、接口文档、帮助文档、用户文档、开发文档等等。参考文档进行测试,一则可以检测文档描述的准确性和易于理解性;二则......
  • Pandas 2.2 中文官方教程和指南(十五)
    原文:pandas.pydata.org/docs/处理文本数据原文:pandas.pydata.org/docs/user_guide/text.html文本数据类型在pandas中有两种存储文本数据的方式:object-dtypeNumPy数组。StringDtype扩展类型。我们建议使用StringDtype来存储文本数据。在pandas1.0之前,ob......
  • Pandas 2.2 中文官方教程和指南(十四)
    原文:pandas.pydata.org/docs/重塑和透视表原文:pandas.pydata.org/docs/user_guide/reshaping.htmlpandas提供了用于操作Series和DataFrame的方法,以改变数据的表示形式,以便进行进一步的数据处理或数据汇总。pivot()和pivot_table():在一个或多个离散类别中对唯一值进行......
  • Pandas 2.2 中文官方教程和指南(五)
    原文:pandas.pydata.org/docs/与SAS的比较译文:pandas.pydata.org/docs/getting_started/comparison/comparison_with_sas.html对于来自SAS的潜在用户,本页面旨在演示如何在pandas中执行不同的SAS操作。如果您是pandas的新手,您可能首先想通过阅读10分钟入门pandas......
  • Pandas 2.2 中文官方教程和指南(四)
    原文:pandas.pydata.org/docs/与SQL比较原文:pandas.pydata.org/docs/getting_started/comparison/comparison_with_sql.html由于许多潜在的pandas用户对SQL有一定的了解,本页旨在提供使用pandas执行各种SQL操作的一些示例。如果你是pandas的新手,你可能想先阅读......
  • Pandas 2.2 中文官方教程和指南(一)
    原文:pandas.pydata.org/docs/安装原文:pandas.pydata.org/docs/getting_started/install.html安装pandas的最简单方法是作为Anaconda发行版的一部分安装,这是一个用于数据分析和科学计算的跨平台发行版。Conda包管理器是大多数用户推荐的安装方法。还提供了从源代码安装(#i......
  • Pandas 2.2 中文官方教程和指南(十二)
    原文:pandas.pydata.org/docs/MultiIndex/高级索引原文:pandas.pydata.org/docs/user_guide/advanced.html本节涵盖了使用MultiIndex进行索引和其他高级索引功能。查看数据索引和选择以获取一般索引文档。警告在设置操作中返回副本还是引用可能取决于上下文。有时这被......