dp 讲课代码汇总

下面是本节课的所涉及取模知识和题目的代码汇总
因为头文件太长了 我就没贴上来了
需要用的话记得加上相应的头文件

1.加法取模、乘法取模、减法取模

ans=(ans%mod+b%mod)%mod;      ans=(ans+b)%mod;
ans=(ans%mod*b)%mod;          ans=ans*b%mod;
ans=(ans%mod-b%mod+mod)%mod   ans=(ans-b+mod)%mod

2.最长上升子序列LIS(n^2dp做法)

题号 poj2533

int a[maxn],dp[maxn];

int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    int maxx=0;
    for(int i=1;i<=n;i++)
    {
        dp[i]=1;//最长上升子序列的值最小应该是1
        for(int j=1;j<i;j++)
        {
            if(a[j]<a[i])
            {
                dp[i]=max(dp[i],dp[j]+1);
            }

        }
        maxx=max(dp[i],maxx);
    }
    printf("%d\n",maxx);
}

3.数字三角形问题(二维dp 正反两种统计方法)

题号 hdu2084

int a[maxn][maxn],dp[maxn][maxn];

int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=i;j++)
            {
                scanf("%d",&dp[i][j]);
            }
        }
        for(int i=2;i<=n;i++)
        {
            for(int j=1;j<=i;j++)
            {
                dp[i][j]+=max(dp[i-1][j],dp[i-1][j-1]);
            }
        }
        int ans=0;
        for(int i=1;i<=n;i++)
            ans=max(ans,dp[n][i]);
        printf("%d\n",ans);
    }
}

int a[maxn][maxn],dp[maxn][maxn];

int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=i;j++)
            {
                scanf("%d",&dp[i][j]);
            }
        }
        for(int i=n-1;i>=1;i--)
        {
            for(int j=1;j<=i;j++)
            {
                dp[i][j]+=max(dp[i+1][j],dp[i+1][j+1]);
            }
        }
        printf("%d\n",dp[1][1]);
    }
}

4.最长公共子序列LCS

题号 HDU - 1159

char a[maxn],b[maxn];
int dp[maxn][maxn];

int main()
{
    while(scanf("%s%s",a+1,b+1)!=EOF)
    {
        int lena=strlen(a+1);
        int lenb=strlen(b+1);
        for(int i=1;i<=lena;i++)
        for(int j=1;j<=lenb;j++)
        dp[i][j]=0;
        for(int i=1;i<=lena;i++)
        {
            for(int j=1;j<=lenb;j++)
            {
                if(a[i]==b[j])
                {
                    dp[i][j]+=dp[i-1][j-1]+1;
                }else
                {
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        printf("%d\n",dp[lena][lenb]);

    }
}

5.01背包(dp基本解法,两种滚动数组优化写发)

题号 HDU - 2602

int w[maxn],v[maxn];
int dp[maxn][maxn];
int n,m;

int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&v[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&w[i]);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=m;j++)
            {
                dp[i][j]=dp[i-1][j];
                if(w[i]<=j)
                dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
            }
        }
        printf("%d\n",dp[n][m]);
    }
        
}

滚动数组优化

int w[maxn],v[maxn];
int dp[5][maxn];
int n,m;

int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&v[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&w[i]);
        memset(dp,0,sizeof(dp));
        int tem=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=0;j<=m;j++)
            dp[tem][j]=0;
            for(int j=0;j<=m;j++)
            {

                dp[tem][j]=dp[tem^1][j];
                if(w[i]<=j)
                dp[tem][j]=max(dp[tem^1][j],dp[tem^1][j-w[i]]+v[i]);
            }
            tem^=1;
        }
        printf("%d\n",dp[tem^1][m]);
    }

}
int w[maxn],v[maxn];
int dp[maxn];
int n,m;

int main()
{
    int _;
    scanf("%d",&_);
    while(_--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
            scanf("%d",&v[i]);
        for(int i=1;i<=n;i++)
            scanf("%d",&w[i]);
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        {
            for(int j=m;j>=w[i];j--)
            {
                dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
            }
        }
        printf("%d\n",dp[m]);
    }

}



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
代码大全(经典教材).pdf 计算机实用软件技术系列丛书 软件开发人员必备工具书 Code Complete 代码大全 Steve McConnell 著 天奥 译 熊可宜 校 学苑出版社 目 录 第一章 欢迎进入软件创建世界⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯1 1.1 什么是软件创建.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯1 1.2 软件创建的重要性.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯3 1.3 小结.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯4 第二章 利用隐喻对编程进行更深刻的理解⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯5 2.1 隐喻的重要性.. ⋯.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯5 2.2 如何使用软件隐喻.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯6 2.3 通常的软件隐喻.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯7 2.4 小结 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯11 第三章 软件创建的先决条件⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯12 3.1 先决条件重要性.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯12 3.2 问题定义先决条件 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯16 3.3 需求分析先决条件 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯16 3.4 结构设计先决条件 ⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯20 3.5 选择编程语言先决条件.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯26 3.6 编程约定.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯29 3.7 应花在先决条件上的时间.⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯⋯29 。。。。。。
PROFIBUS DP主站代码是用于控制和通信的主站设备的程序代码。PROFIBUS DP是一种工业现场总线通信协议,用于实现不同设备之间的数据交换和通信。 PROFIBUS DP主站代码通常涉及以下几个方面的功能实现: 1. 初始化:主站代码首先需要初始化PROFIBUS DP通信模块,包括配置通信参数和建立网络连接。 2. 设备检测:主站代码会定期扫描网络上的从站设备,通过发送查询命令并等待从站的响应来检测设备的存在和状态。 3. 数据读取和写入:主站代码可以周期性地向从站设备发送读取数据的命令,并通过解析从站的响应来获取所需的数据。同时,主站代码也可以发送写入数据的命令,将需要传输的数据发送给从站设备。 4. 故障诊断:主站代码需要在通信过程中监测异常情况,如通信错误、设备故障等。一旦发现异常,主站代码会进行相应的故障诊断并采取必要的措施进行处理。 5. 连接管理:PROFIBUS DP支持多个从站设备的连接管理,主站代码需要实现从站设备的注册和取消注册的功能,以便进行灵活的设备管理。 综上所述,PROFIBUS DP主站代码是一种控制和通信的程序代码,用于控制主站设备与从站设备之间的通信和数据交换。主站代码实现了初始化、设备检测、数据读取和写入、故障诊断以及连接管理等功能。通过准确的编写和实现主站代码,可以实现稳定、高效的PROFIBUS DP通信。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值