首页 > 其他分享 >2023ACM暑期集训 DAY 1

2023ACM暑期集训 DAY 1

时间:2023-07-15 16:45:56浏览次数:63  
标签:int ll 2023ACM 暑期 maxn long DAY dp mp

目前进度——动态规划1:线性dp、背包问题,区间

好题

1003 可爱の星空

标签

递推 分治

思路

  1. 记 \(dp_i\) 表示将 \(i\) 颗点合并为一个连通块所需的最小代价。根据贪心思想:若目前的总点数 \(n\) 为偶数,则 \(dp_n=2*dp_{\frac{n}{2}}\);若目前的总点数 \(n\) 为奇数,则 \(dp_n=dp_{[\frac{n}{2}]+1}+dp_{[\frac{n}{2}]}+1\)。故递推即可。
  2. 时间复杂度为 \(\mathcal O(t\log n)\)。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int t;
ll n;
map<ll,ll> mp;
void dp(ll x)
{
    if(mp.find(x)!=mp.end())
        return;
    if(x==1||x==0)
    {
        mp[x]=0;
        return;
    }
    if(x&1)
    {
        dp(x>>1),dp((x>>1)+1);
        mp[x]=mp[x>>1]+mp[(x>>1)+1]+1;
    }
    else dp(x>>1),mp[x]=mp[x>>1]*2;
}
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lld",&n);
        dp(n);
        printf("%lld\n",mp[n]);
    }
    return 0;
}

1005 花店橱窗

标签

递推

思路

  1. 有条件的线性递推,时间复杂度为 \(\mathcal O(FV^2)\)。
  2. 易错点在于初始化if(i==f&&j>=f) dp[i][j]=vi[i][j];
    错误的写为 if(i==f) dp[i][j]=vi[i][j] 会导致错误。由此得到收获,初始化一定要严谨。

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
const int maxn=110;
const long long INF=-9223372036854775808;
int f,v,fa[maxn][maxn];
long long vi[maxn][maxn],dp[maxn][maxn];
int main()
{
    scanf("%d%d",&f,&v);
    for(int i=1;i<=f;i++)
    {
        for(int j=1;j<=v;j++)
        {
            dp[i][j]=INF,fa[i][j]=j;
            scanf("%lld",&vi[i][j]);
            if(i==f&&j>=f) dp[i][j]=vi[i][j];
        }
    }
    for(int i=f-1;i>=1;i--)
    {
        for(int j=1;j<=v-(f-i);j++)
        {
            for(int k=j+1;k<=v;k++)
            {
                if(dp[i+1][k]!=INF && vi[i][j]+dp[i+1][k]>dp[i][j])
                {
                    dp[i][j]=dp[i+1][k]+vi[i][j],fa[i][j]=k;
                }
            }
        }
    }
    long long maxid=1,maxdp=dp[1][1];
    for(int i=2;i<=v;i++)
    {
        if(dp[1][i]>maxdp)
        {
            maxid=i,maxdp=dp[1][i];
        }
    }
    printf("%lld\n",maxdp);
    for(int i=1,j=maxid;i<=f;i++)
    {
        printf("%d ",j);
        j=fa[i][j];
    }
    return 0;
}

1007 钉子和小球 PS:好题

标签

概率DP

思路

  1. 概率DP,本题易得到 \(\mathcal O(n^2)\) 的做法。
  2. 注意点:由无钉子处向其他点的转移与由有钉子处向其他点的转移是不同的,具体表现在权重不同

代码

点击查看代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=55;
int n,m;
ll dp[maxn][maxn];
char tp[maxn][maxn];
ll gcd(ll a,ll b)
{
    if (a<b) swap(a,b);
    if(b==0) return a;
    else return gcd(b,a%b);
}
int main()
{
    scanf("%d%d",&n,&m);
    char ch=getchar();
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            while(ch=='\n'||ch==' ')
                ch=getchar();
            tp[i][j]=ch;
            ch=getchar();
        }
    }
    dp[1][1]=1;
    for(int i=0;i<=n;i++)
    {
        for(int j=1;j<=i;j++)
        {
            if(tp[i][j]=='*') 
                dp[i+1][j]+=dp[i][j],dp[i+1][j+1]+=dp[i][j];
            else
            {
                if(i+2<=n+1) dp[i+2][j+1]+=4*dp[i][j];
                else if(i+2==n+2) dp[n+1][j+1]+=2*dp[i][j];
            }
        }
    }
    ll sum=0;
    for(int i=1;i<=n+1;i++)
        sum+=dp[n+1][i];
    while(sum%2==0&&dp[n+1][m+1]%2==0) sum/=2,dp[n+1][m+1]/=2;
    printf("%lld/%lld",dp[n+1][m+1],sum);
    return 0;
}

标签:int,ll,2023ACM,暑期,maxn,long,DAY,dp,mp
From: https://www.cnblogs.com/shyiaw/p/17556444.html

相关文章

  • Python学习——Day 6
    流程控制语句break·break语句   ·用于结束循环结构,通常与分支结构if一起使用#输入密码,最多录入3次,如果正确就结束循环foriteminrange(3):pwd=input('请输入密码:')ifpwd=='8888':print('密码正确')breakelse:print('密码......
  • 初学C语言day01——第一个C语言程序
    第一个C语言程序#include<stdio.h>//包含头文件#预处理指令(在预处理阶段进行处理)//argc表示命令行参数的个数argv一个字符串数组命令行参数intmain(intargc,char*argv[]){printf("Helloworld!\n");//标准输出函数C语言程序本身是没有输入输出......
  • 暑期第四周总结
    本周花在学习上的时间大概为21小时,花在代码上的时间大概为11小时。花在解决问题上的时间大概为4小时。本周,我完成了创建虚拟机,在虚拟机上完成了部署伪分布式的hdfs,在虚拟机上配置了java的环境变量,还有hadoop的环境变量,我完成了nosql数据库的学习,知道了nosql数据库和传统的关系型数......
  • Java基础--day02
    变量作用域类变量、实例变量、局部变量 publicclassDemo03{/***类变量static*/staticdoublesalary=89561.36;/***实例变量*从属于对象*不初始化,会变成默认类型*00.0布尔值默认false*除了基本类......
  • day03 链表基本操作
    前置知识,链表数据结构1.移除链表元素移除链表元素不难,只需要把前一个结点的下一节点指向下一个节点的下一节点如果当前遍历的节点与所给值相等,则需要移除此元素,移除元素是将上一节点的next域设置为当前节点的next,当前节点后移一位如果当前遍历的节点值不等于所给值,则前驱......
  • c++ day 9
    今天来学习选择排序选择排序有多种方法下面是方法一:选择排序(SelectionSort)是一种简单但低效的排序算法。它的基本思想是在未排序的部分中选择最小(或最大)的元素,并将其放置在已排序部分的末尾。通过重复这个过程,直到所有元素都排好序为止。下面是选择排序的C++实现示例:#incl......
  • day5
    一、[闽盾杯2021]DNS协议分析1.打开流量,过滤dns类型,发现一些类似于base64的编码,并且有规律的出现2.全部提取,ZmxhZ3tlNjYyYWMxNTRjYTM3NmUxYzAwMWVlOGJiZTgxMzE4Yn0K,base64在线解码二、云1.1.1得到一个URL,进去后界面显示一个hint的链接1.2告诉我们整体是一个SpringBoot......
  • Python基础day45
    SQL注入问题importpymysql#连接MySQL服务端conn=pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='db8_3',charset='utf8',autocommit=True#针对增......
  • 暑期记录7
    7月13今天很热,天气预报总是不准的。我记得在早上看下午有雨,还挺开心的,结果一出门看这大太阳,怎么能下成雨。果然到了下午,还是没有雨。。关键是今天下午小区里还停电了,便更加燥热了。干脆骑着我的小电动车到处溜达,果然路上的感觉还是很凉快的。到家了,来电了。......
  • day01
    变量变量的命名应该满足以下三个规范:1.变量的命名应该能反映变量值所描述的状态,切记不要用中文2.变量名可由字母、数字和下划线组成,但是不能以数字开头3.关键字不能声明为变量名以下为常见的几个变量名['and','as','assert','break','class','continue','def','del',......