首页 > 其他分享 >DP训练笔记

DP训练笔记

时间:2023-10-26 15:15:09浏览次数:33  
标签:10 long 训练 int res 笔记 DP dp mod

预计时间一个月,一天的量为1-2道左右,难度不均,黄-紫都有,后阶段紫

// https://www.luogu.com.cn/problem/P4141

// 对于任何一个物品对答案的贡献都是从1到n递推过去的,所以
// 只需要开一个相同的数组然后从头遍历一遍,把该物品对答案的贡献减去就可以了

#include<bits/stdc++.h>
using namespace std;
const int N=4020;
int dp[N],res[N],w[N],n,m;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>w[i];
    dp[0]=1,res[0]=1;
    for(int i=1;i<=n;i++)
        for(int j=m;j>=w[i];j--) dp[j]=(dp[j]+dp[j-w[i]])%10;
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++){
            if(j<w[i]) res[j]=dp[j];
            //对于每个包含于i的物品答案数,用dp数-去未包含他的数即为答案数
            else res[j]=(dp[j]-res[j-w[i]]+10)%10;//别忘了相减取模要+模数
            cout<<res[j];
        }
        cout<<endl;
    }
    return 0;
}
//https://www.luogu.com.cn/problem/CF607B

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=2040,mod=1e9+7;
int n,t,dp[N][N],a[N];
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=n;i>=1;i--){ //区间dp,这样的顺序是对的
        for(int j=i;j<=n;j++){
            //初始化:
            if(i==j) {dp[i][j]=1;continue;}
            if(i+1==j) {dp[i][j]=(a[i]==a[j]?1:2);continue;}
            dp[i][j]=1e18;
            //枚举区间长度
            for(int k=i;k<j;k++) 
                dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
            if(a[i]==a[j]) dp[i][j]=min(dp[i][j],dp[i+1][j-1]);
        }
    }
    cout<<dp[1][n];
    return 0;
}
//https://www.luogu.com.cn/problem/CF1513C

//可以肯定的是,对于任何一位的数来说,他能变得长度是确定得
//例如 9,它经过2两次变化长度一定是2,其它位对9这一位没影响
//所以先预处理来每个数能够变成得最多长度

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10,mod=1e9+7;
string s;
int n,t,a[N],f[N],res,num,ans,m,k;
vector<vector<int>>dp(N+1,vector<int>(10));
void solve()
{
    cin>>s>>n; res=0;
    for(char c:s) res=(res+dp[n][c-'0'])%mod;
    cout<<res<<endl;
}
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>t;
    //dp[i][j]为,数字j经过i次变换之后有多长
    //状态转移为 : 9先由1位变成2位,然后下一次变化后,8就是9,7就是8,以此类推
    for(int i=0;i<=9;i++) dp[0][i]=1;
    for(int i=1;i<=N;i++){
        for(int j=0;j<=8;j++) dp[i][j]=dp[i-1][j+1]%mod;
        dp[i][9]=(dp[i-1][1]+dp[i-1][0])%mod;
       // for(int j=0;j<=9;j++) cout<<dp[i][j]<<' ';cout<<endl;
    }
    while(t--){
        solve();
    }
    return 0;
}

// //另一种思路: 逢10进1,就有:
// if(i+j>=10) dp[i][j]=dp[i+j-10][0]+dp[i+j-10][1]%mod;
// else dp[i][j]=1;
// 如果i+j>10,那么操作后是两位,分别是1和0,而从j到10需要10-j步,还剩i+j-10步
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=3e5+10,mod=1e9+7;
string s;
int n,t,a[N],f[N],res,num,ans,m,k;
vector<vector<int>>dp(N+1,vector<int>(10));
void solve()
{
    cin>>s>>n; res=0;
    for(char c:s) res=(res+dp[n][c-'0'])%mod;
    cout<<res<<endl;
}
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>t;
    //dp[i][j]为,数字j经过i次变换之后有多长
    //状态转移为 : 9先由1位变成2位,然后下一次变化后,8就是9,7就是8,以此类推
    for(int i=0;i<=9;i++) dp[0][i]=1;
    for(int i=1;i<=N;i++){
        for(int j=0;j<=9;j++)
            if(i+j>=10) dp[i][j]=dp[i+j-10][0]+dp[i+j-10][1]%mod;
            else dp[i][j]=1;
       // for(int j=0;j<=9;j++) cout<<dp[i][j]<<' ';cout<<endl;
    }
    while(t--){
        solve();
    }
    return 0;
}
//https://www.luogu.com.cn/problem/CF711C
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N=205;
int dp[N][N][N],res=1e18,n,m,x;
/*
dp[i][j][k] 是第i个树,第j个颜色,当前是第k组
col[i]是当前的染色情况
c是 n x m 的花费
*/
int col[N],c[N][N];
signed main()
{
    std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    cin>>n>>m>>x;
    for(int i=1;i<=n;i++) cin>>col[i];
    for(int i=1;i<=n;i++) 
        for(int j=1;j<=n;j++) cin>>c[i][j];
    //初始化
    memset(dp,0x3f,sizeof dp);
    //如果说第一位已经被染了,那么就不管了,因为要从第一位开始递推,如果没染那就都染一遍
    if(col[1]) dp[1][col[1]][1]=0;
    else for(int i=1;i<=m;i++) dp[1][i][1]=c[1][i];
    for(int i=2;i<=n;i++){
        if(col[i]){ //如果已经确定被染色
            for(int j=1;j<=m;j++){
                for(int k=1;k<=x;k++){
                    if(j!=col[i]) dp[i][col[i]][k]=min(dp[i][col[i]][k],dp[i-1][j][k-1]); //不同组
                    else dp[i][col[i]][k]=min(dp[i][col[i]][k],dp[i-1][col[i]][k]);// 同组
                }
            }
        }
        else{
            for(int j=1;j<=m;j++){
                for(int h=1;h<=m;h++){
                    for(int k=1;k<=x;k++){
                        if(j!=h) dp[i][j][k]=min(dp[i][j][k],dp[i-1][h][k-1]+c[i][j]);
                        else dp[i][j][k]=min(dp[i][j][k],dp[i-1][j][k]+c[i][j]);
                    }
                }
            }
        }
    }
    if(col[n]) res=dp[n][col[n]][x];
    else for(int i=1;i<=m;i++) res=min(res,dp[n][i][x]);
    cout<<(res>=1e18/2?-1:res);
    return 0;
}

 

标签:10,long,训练,int,res,笔记,DP,dp,mod
From: https://www.cnblogs.com/o-Sakurajimamai-o/p/17789433.html

相关文章

  • 信息安全系统设计与实现 学习笔记6
    并发编程并行计算基于分治原则的算法经常表现出高度的并行性,可通过使用并行或并发执行来提高计算速度。顺序算法和并行算法顺序算法beginstep_1step_2...step_nend//nextstep并行算法cobegintask_1task_2...task_ncoand//nextstep......
  • 线性代数笔记02
    蓝月の笔记——线性代数\(.02\)视频链接\(\mathfrak{Mathematics\requires\a\small\dose,\not\of\genius,\but\of\an\imaginative\freedom\which,\in\a\larger\dose,\would\be\insanity.}\)......
  • vue学习笔记之执行顺序
       vue文件加载顺序:index.html>app.vue>main.js     加载顺序详情:执行index.html(index.html中id为app的div标签是一个挂载点,之后我们的Vue根实例就会挂载到该挂载点上)执行main.jsmain.js找到实例挂载app.vue文件,将index.html的挂载的内容显示出来(用app.vue的template......
  • MarkDown笔记如何上传cnblog
    简介Dotnet-cnblog工具可以配合typora实现自动上传md文件里图片到博客园的图床,这样就不用自己一张张来上传安装过程1.配置NET环境net环境下载地址:https://dotnet.microsoft.com/zh-cn/download/dotnet/5.0下载后安装NET环境,运行cmd命令:dotnet--info查看是否安装成功2.安......
  • 训练营D9T2:爱看书的思考者
    题意简化:将书本进行排序后,假设每本书阅读时间对应不同区间,现在给出每本书对应的区间长度。假如阅读者0时刻开始阅读,输入当前时间,输出当前时间对应阅读的书本。 十分典型的二分查找。就是找到一个区间使得当前时间恰好卡在书本位置。为此可以将每一本书对应的左右区间求出,用二......
  • 20211325 2023-2024-1 《信息安全系统设计与实现(上)》第七周学习笔记
    202113252023-2024-1《信息安全系统设计与实现(上)》第七周学习笔记一、任务要求1.自学教材第4章,提交学习笔记(10分),评分标准如下1.知识点归纳以及自己最有收获的内容,选择至少2个知识点利用chatgpt等工具进行苏格拉底挑战,并提交过程截图,提示过程参考下面内容(4分)“我在学***X知......
  • Java面试笔记
    Java面试笔记Java面试笔记第一章:Java基础知识1.1Java程序初始化顺序Java程序初始化一般遵循以下三个原则(优先级依次递减)静态对象(变量)​优先于​非静态对象初始化静态对象初始化一次非静态对象可能初始化多次父类优先于子类初始化按照成员变量定义顺序进行初始化即使变......
  • esp32笔记[9]-rust的串口收发及GCODE解析
    摘要使用rust在no-std环境下实现esp32-c3串口收发及gcode解析.平台信息esp32c3rust超链接esp32笔记[7]-使用rust+zig开发入门使用rust实现串口中断示例代码:serial_interrupts.rs//!ThisshowssomeoftheinterruptsthatcanbegeneratedbyUART/Serial.//!Us......
  • DeepSpeed: 大模型训练框架 | 京东云技术团队
    背景:目前,大模型的发展已经非常火热,关于大模型的训练、微调也是各个公司重点关注方向。但是大模型训练的痛点是模型参数过大,动辄上百亿,如果单靠单个GPU来完成训练基本不可能。所以需要多卡或者分布式训练来完成这项工作。一、分布式训练1.1目前主流的大模型分布式训练主要包括两种:......
  • 《Unix/linux系统编程》教材第4章学习笔记
    |第4章|并发编程并行计算导论基于分治原则(如二叉树查找和快速排序等)的算法经常表现出高度的行性,可通过使用并行或并发执行来提高计算速度。并行计算是一种计算方案,它尝试使用多个执行并行算法的处理器更快速地解决问题。顺序算法与并行算法用一个begin-end代码块列出代码......