首页 > 其他分享 >2023.1.7 DP 学习日志

2023.1.7 DP 学习日志

时间:2023-01-07 16:55:14浏览次数:59  
标签:read ll long 2023.1 isdigit 日志 getchar DP define

上午

编辑距离(AcWing.899

思路:同最短编辑距离,只不过要做 \(m\) 次。

code:

#include <bits/stdc++.h>
#define ll long long
#define N 1005
using namespace std;
inline ll read()
{
    ll x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-') f=-f;c=getchar();}
    while(isdigit(c)){x=x*10+c-48;c=getchar();}
    return (f==1)?x:-x;
}//卡长
ll k=read(),t=read(),l,ans,cnt,maxn,f[N][N];
char s[N][N];
void init(ll n,ll m)
{
    for(ll i=0;i<=maxn;i++)
    {
        if(i<=n) f[i][0]=i;
        if(i<=m) f[0][i]=i;
    }
}
ll check(char a[],char b[])
{
    ll n=strlen(a+1),m=strlen(b+1);
    maxn=max(n,m);init(n,m);
    for(ll i=1;i<=n;i++)
    {
        for(ll j=1;j<=m;j++)
        {
            f[i][j]=min(f[i][j-1],f[i-1][j])+1;
            f[i][j]=min(f[i][j],f[i-1][j-1]+(a[i]!=b[j]));//这里改进了一下
        }
    }
    return f[n][m];
}//最短编辑距离
int main()
{
    ios::sync_with_stdio(0);cout.tie(0);//卡长
    for(ll i=0;i<k;i++) scanf("%s",s[i]+1);
    while(t--)
    {
        ans=0;char ask[N];
        scanf("%s",ask+1);l=read();
        for(ll i=0;i<k;i++)
            if(check(s[i],ask)<=l)
                ans++;//统计答案
        cout << ans << endl;
    }
    return 0;
}

下午

整数划分(AcWing.900

做法1:01背包

#include <bits/stdc++.h>
#define ll long long
#define N 1005
#define mod 1000000007
using namespace std;
inline ll read()
{
    ll x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-') f=-f;c=getchar();}
    while(isdigit(c)){x=x*10+c-48;c=getchar();}
    return (f==1)?x:-x;
}
ll n=read(),f[N];
int main()
{
    f[0]=1;
    for(ll i=1;i<=n;i++)
        for(ll j=i;j<=n;j++)
            f[j]=(f[j]+f[j-i])%mod;
    cout << f[n];
    return 0;
}

做法2:计数DP

image

  1. 状态表示
    f[i][j]表示所有总和是 \(i\),并且能拆分成 \(j\) 个数的方案总数。

  2. 循环范围
    \(i\) 表示总和,总和最多是 \(n\),因此 \(i\) 的循环范围是 1~\(n\)。
    \(j\) 表示拆成多少个数,拆分最多能拆成 \(i\) 个(每个数都是1),因此 \(i\) 的循环范围是 1~\(i\)。

  3. 状态转移
    首先考虑把f[i][j]分成两个完全不重复的集合。
    可以分成最小值为1的集合、最小值大于1的集合。

    最小值为1的集合如果减去最小值1,那总和就是 \(i\)-1,拆分后数的数量为 \(j\)-1。
    最小值大于1的集合如果每个数都减去1,那总和就是 \(i\)-\(j\),拆分后数的数量不变。

    f[i][j]就是这两个方案总数的和。

    可得,转移方程为:
    f[i][j]=f[i-1][j-1]+f[i-j][j];

有了这些,就可以打出code:

#include <bits/stdc++.h>
#define ll long long
#define N 1005
#define mod 1000000007
using namespace std;
inline ll read()
{
    ll x=0,f=1;char c=getchar();
    while(!isdigit(c)){if(c=='-') f=-f;c=getchar();}
    while(isdigit(c)){x=x*10+c-48;c=getchar();}
    return (f==1)?x:-x;
}//卡长
ll n=read(),ans,f[N][N];
int main()
{
    f[0][0]=1;
    for(ll i=1;i<=n;i++)
        for(ll j=1;j<=i;j++)
            f[i][j]=(f[i-1][j-1]+f[i-j][j])%mod;//要取模
    for(ll i=1;i<=n;i++) ans=(ans+f[n][i])%mod;//最后的答案就是不同拆分后数的数量的每种方案的和
    cout << ans;
    return 0;
}

标签:read,ll,long,2023.1,isdigit,日志,getchar,DP,define
From: https://www.cnblogs.com/wangxuzhou-blog/p/17032980.html

相关文章

  • 宝塔 Nginx 实现日志记录 Cloudflare 下访客真实IP
    网站套Cloudflare后,Nginx日志记录的都CloudflareIP,要记录访客真实IP,可以按下面方法:1.自动化脚本生成如下配置文件因为Cloudflare的IP段会定期更新,所以建个任务计......
  • 2023.1.7学习笔记
    、经典类与新式类经典类:​不继承object的类或者其子类的类新式类:​继承object或者其之类的类​在python3中,只有新式类,所有类都默认继承object​在python2中,区......
  • DPlayer播放器H5页面实现视频全屏播放滑动操作(滑动快进,滑动音量增减)
     官方文档:https://dplayer.diygod.dev/zh/guide.html#%E5%8F%82%E6%95%B0 player.on('fullscreen',function(){$("body").on("touc......
  • WordPress 版本更新
    WordPress是一个内容管理系统(WCM),即它是一种以最佳方式组织创建、存储和展示Web内容的整个过程的工具。WordPress作为一种改进工具开始了它的旅程,以增强日常写作的常......
  • C++ - TCP/UDP网络编程
    前言socket编程分为TCP和UDP两个模块,其中TCP是可靠的、安全的,常用于发送文件等,而UDP是不可靠的、不安全的,常用作视频通话等。如下图:头文件与库:#include<WinSock2.h>......
  • 高维前缀和与 SOSDP
    高维前缀和高维前缀和,就是对每一个高维空间的点\((a_1,a_2,\cdots,a_k)\),求\(\displaystyle\sum_{b_1=0}^{a_1}\sum_{b_2=0}^{a_2}\cdots\sum_{b_k=0}^{a_k}val_{(......
  • 轻量级实时容器Docker查看日志工具实践
    轻量级实时容器Docker查看日志工具实践     介绍一款使用了几个月的开源小工具,Dozzle。基于MIT许可,它是一款轻量、简单的容器日志查看工具。其源代码基于GOLANG开发......
  • 力扣每日一题2023.1.6---2180. 统计各位数字之和为偶数的整数个数
    给你一个正整数num,请你统计并返回小于或等于num且各位数字之和为偶数的正整数的数目。正整数的各位数字之和是其所有位上的对应数字相加的结果。示例1:输入:num=......
  • 2023.1.6 (Codeforces Round #842 (Div. 2))
    A.GreatestConvexLinkhttps://codeforces.com/contest/1768/problem/ADescription求出最大的\(x(1\leqx<k)\),使得\(x!+(x-1)!\)是\(k\)的倍数。Soluti......
  • 2023.1.6
    搜索了某些学校的心理学培养方案,并没有找到相应的课本和参考教材。有几个可以参考下:【资料整理】如何看到国内外各大学的课表、课程大纲,https://zhuanlan.zhihu.com/p/4......