首页 > 其他分享 >dp专题

dp专题

时间:2024-07-27 14:51:17浏览次数:6  
标签:专题 int long 300 using include dp

1.花店橱窗

原题链接:https://ac.nowcoder.com/acm/contest/87275/1005

注意放与不放是平行的

查看代码

#include <bits/stdc++.h>
#define int long long
using namespace  std;
int va[110][110];
int f[1000000];
struct node
{
    int a[110];
    int t;
}way[110][110];//记录路径
signed main()
{
    int n,m;
    cin>>n>>m;
    vector<vector<int >> dp(105,vector<int>(105,-LLONG_MAX));
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cin>>va[i][j];
        }
    }
    for(int i=0;i<=m;i++)
    {
        dp[0][i]=0;
    }
    for(int i=1;i<=n;i++)//第i束花是否放到第j个瓶
    {
        for(int j=i;j<=m;j++)
        {
            if(dp[i-1][j-1]+va[i][j]>dp[i][j-1])//是
            {
                way[i][j]=way[i-1][j-1];
                way[i][j].a[++way[i][j].t]=j;
                dp[i][j]=dp[i-1][j-1]+va[i][j];
            }
            else//否
            {
                way[i][j]=way[i][j-1];
                dp[i][j]=dp[i][j-1];
            }
        }
    }
    cout<<dp[n][m]<<endl;
    for(int i=1;i<=way[n][m].t;i++)
        cout<<way[n][m].a[i]<<" ";
    return 0;
}

2.过河卒

原题链接:https://ac.nowcoder.com/acm/contest/87275/1007

板子题

查看代码
 #include<bits/stdc++.h>
using namespace std;
#define int long long
int dp[100][100];
signed main()
{
    int a,b,c,d;
    cin>>a>>b>>c>>d;
    for(int i=0;i<=a;i++)
    {
        for(int j=0;j<=b;j++)
        {
            if((i-c)*(i-c)+(j-d)*(j-d)==5||(i==c&&j==d))dp[i][j]=0;
            else
            {
                if(i==0&&j==0)dp[i][j]=1;
                else
                {
                    if(i==0)dp[i][j]+=dp[i][j-1];
                    else if(j==0)dp[i][j]+=dp[i-1][j];
                    else dp[i][j]=dp[i-1][j]+dp[i][j-1];
                }
            }
        }
    }
    cout<<dp[a][b];
    return 0;
}

3.传球游戏

原题链接:https://ac.nowcoder.com/acm/contest/87275/1008

注意在第一个人和第n个人的时候,因为是个圈

查看代码
 #include <bits/stdc++.h>
#define int long long
using namespace  std;
int a[1000000];
signed main()
{
    int n,m;
    cin>>n>>m;
    vector<vector<int >> dp(m+1,vector<int>(n+1,0));
    dp[0][1]=1;
    for(int i=1;i<=m;i++)//第i次传球后球在j手中的方法数
    {
        for(int j=1;j<=n;j++)
        {
            if(j==1)dp[i][j]=dp[i-1][n]+dp[i-1][j+1];
            else if(j==n)dp[i][j]=dp[i-1][j-1]+dp[i-1][1];
            else dp[i][j]=dp[i-1][j-1]+dp[i-1][j+1];
        }
    }
    cout<<dp[m][1];
    return 0;
}

4.[NOIP1999]拦截导弹

原题链接:https://ac.nowcoder.com/acm/contest/87275/1011

最长上升子序列问题

查看代码
 #include <bits/stdc++.h>
using namespace std;
vector<int>a;
int dp[10010];
int g[1000000];
int main() {
    string n;
    while(cin>>n){
        if(n=="\n")break;
        int t=stol(n);
        a.push_back(t);
    }
    reverse(a.begin(),a.end());
    //for(int i=0;i<a.size();i++)cout<<a[i]<<" ";
    for(int i=0;i<a.size();i++){
        dp[i]=1;
    }
    int ans=1,res=0;
    for(int i=1;i<a.size();i++){
        for(int j=0;j<i;j++){
            if(a[j]<a[i]){
                dp[i]=max(dp[i],dp[j]+1);
            }
            ans=max(ans,dp[i]);
        }
    }
    reverse(a.begin(),a.end());
    for(int i=0;i<a.size();i++)
    {
        int k=0;
        while(k<res&&g[k]<a[i])k++;
        g[k]=a[i];
        if(k>=res)res++;
    }
    cout<<ans<<endl;
    cout<<res;
    return 0;
}

5.[NOIP2004]合唱队形

原题链接;https://ac.nowcoder.com/acm/contest/87275/1010

最长上升子序列和最长下降子序列拼一起

查看代码
 #include <bits/stdc++.h>
using namespace std;
int a[1000000];
int MAX;
int dp[10010],fp[10010];
int main() {
    int n;
    cin>>n;
    for(int i=0;i<n;i++)cin>>a[i];
    for(int i=0;i<n;i++){
        dp[i]=1;
    }
    int ans=1;
    for(int i=1;i<n;i++){
        for(int j=0;j<i;j++){
            if(a[j]<a[i]){
                dp[i]=max(dp[i],dp[j]+1);
            }
        }
    }
    for(int i=n;i>=1;i--){
        for(int j=n;j>i;j--){
            if(a[j]<a[i]){
                fp[i]=max(fp[i],fp[j]+1);
            }
        }
        MAX=max(MAX,dp[i]+fp[i]-1);//同一个位置的上升和下降子序列加一起再减去重叠的自己
    }
    cout<<n-MAX<<endl;
    return 0;
}

6.装箱问题

原题链接:https://ac.nowcoder.com/acm/contest/87275/1016

板板

查看代码
 #include <bits/stdc++.h>
#define int long long
using namespace  std;
int a[1000000];
signed main()
{
    int v,n;
    cin>>v>>n;
    for(int i=1;i<=n;i++)cin>>a[i];
    vector<int> dp(v + 1, 0);
    dp[0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=v;j>=a[i];j--)
        {
            if(dp[j-a[i]])dp[j]=dp[j-a[i]];
        }
    }
    int ans=0;
    for(int i=v;i>=0;i--)
    {
        if(dp[i])
        {
            ans=i;
            break;
        }
    }
    cout<<v-ans;
    return 0;
}

7.小A买彩票

原题链接:https://ac.nowcoder.com/acm/contest/87275/1013

有点类似装箱问题,只不过是要计算方案数

查看代码
 #include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1001;
int n,m;
int v[N],w[N];
int f[N][N];
int gcd(int a,int b){
    return b==0?a:gcd(b,a%b);
}
signed main()
{
    cin>>n;
    f[0][0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=4*i;j++)
        {
            for(int k=1;k<=4;k++)
            {
                if(j>=k)
                f[i][j]+=f[i-1][j-k];
            }
        }
    }
    int ans=0;
    for(int i=3*n;i<=4*n;i++)
        ans+=f[n][i];
    int sum=pow(4,n);
    int p=gcd(ans,sum);
    cout<<ans/p<<"/"<<sum/p;
    return 0;
}

8.CSL分苹果

原题链接:https://ac.nowcoder.com/acm/contest/87275/1019

装箱问题变形,就是把容量砍了一半

查看代码
 #include <bits/stdc++.h>
#define int long long
using namespace  std;
int a[1000000];
signed main()
{
    int n;
    cin>>n;
    int v1=0;
    for(int i=1;i<=n;i++)cin>>a[i],v1+=a[i];
    int v=v1/2;
    vector<int> dp(v + 1, 0);
    dp[0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=v;j>=a[i];j--)
        {
            if(dp[j-a[i]])dp[j]=dp[j-a[i]];
        }
    }
    int ans=0;
    for(int i=v;i>=0;i--)
    {
        if(dp[i])
        {
            ans=i;
            break;
        }
    }
    cout<<ans<<" "<<v1-ans;
    return 0;
}

9.石子合并

原题链接:https://ac.nowcoder.com/acm/contest/87275/1024

板板,但是是圈状石子合并问题

查看代码
#include<bits/stdc++.h>
using namespace std;
const int N=0x3f3f3f3f;
int dp[300][300],fp[300][300];
int a[300],b[300];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        a[i+n]=a[i];
    }
    for(int i=1;i<=2*n;i++)
    {
        b[i]=b[i-1]+a[i];
    }
    for(int i=2*n-1;i>=1;i--) {
        for (int j=i+1;j<i+n;j++) {
                dp[i][j]=N;
                for (int k = i; k < j; k++) {//从k处断开,分别计算,达到一个递归的效果
                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + b[j] - b[i - 1]);
                    fp[i][j] = max(fp[i][j], fp[i][k] + fp[k + 1][j] + b[j] - b[i - 1]);
                }
            }
    }
    int ma=0,mi=N;
    for(int i=1;i<=n;i++)
    {
        ma=max(ma,fp[i][i+n-1]);
        mi=min(mi,dp[i][i+n-1]);
    }
    cout<<mi<<endl;
    cout<<ma<<endl;
    return 0;
}

带状如下

查看代码
 #include<bits/stdc++.h>
using namespace std;
const int N=0x3f3f3f3f;
int dp[300][300],fp[300][300];
int a[300],b[300];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=1;i<=n;i++)
    {
        b[i]=b[i-1]+a[i];
    }
    for(int i=n-1;i>=1;i--) {
        for (int j=i+1;j<i+n;j++) {
                dp[i][j]=N;
                for (int k = i; k < j; k++) {
                    dp[i][j] = min(dp[i][j], dp[i][k] + dp[k + 1][j] + b[j] - b[i - 1]);
                    //fp[i][j] = max(fp[i][j], fp[i][k] + fp[k + 1][j] + b[j] - b[i - 1]);
                }
            }
    }
    cout<<dp[1][n];
    //cout<<mi<<endl;
    //cout<<ma<<endl;
    return 0;
}

10.失衡天平

原题链接:https://ac.nowcoder.com/acm/contest/87275/1020

01背包问题,比一般要复杂的是放的情况有两种

查看代码
 #include <bits/stdc++.h>
#define int long long//背包
using namespace  std;
int dp[111][11100];
int a[1000000];
signed main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    memset(dp,-0x3f3f3f3f,sizeof dp);
    dp[0][0]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=10000;j++)
        {
            dp[i][j]=max({dp[i-1][j],dp[i-1][abs(j-a[i])]+a[i],dp[i-1][j+a[i]]+a[i]});
        } //三种情况分别为,不放,放在较轻的一端,放在较重的一段
    }
    int ans=0;
    for(int i=0;i<=m;i++)
    {
        ans=max(ans,dp[n][i]);
    }
    cout<<ans;
    return 0;
}

标签:专题,int,long,300,using,include,dp
From: https://www.cnblogs.com/violet-hty/p/18326937

相关文章

  • Diffusion|DDPM 理解、数学、代码
    Diffusion论文:DenoisingDiffusionProbabilisticModels参考博客openinnewwindow;参考paddle版本代码:aistudio实践链接openinnewwindow该文章主要对DDPM论文中的公式进行小白推导,并根据ppdiffuser进行DDPM探索。读者能够对论文中的大部分公式如何得来,用在了什么......
  • ScheduledThreadPoolExecutor
    定时任务ScheduledThreadPoolExecutor类有两个用途:指定时间延迟后执行任务;周期性重复执行任务。JDK1.5之前,主要使用Timer类来完成定时任务,但是Timer有以下缺陷:Timer是单线程模式;如果在执行任务期间某个TimerTask耗时较久,就会影响其它任务的调度;Timer的任务调度是基于......
  • 2024736DP专项练习赛
    前言比赛链接榜上那个冒着蓝光的就是我……提交记录跟答辩一样……\(\color{#F8BBD0}Heldivis%%%%%%%%%%%%%%%%%%%\)吐槽一下,虽然挂着DP专题赛的名字,但除了T1T3以外,全是记搜题(虽然好像只有四道题来着)。T1签到题,\(n\)范围很小,先用区间dp求出任意区间达到最终状态......
  • Luogu P3177 树上染色 [ 蓝 ] [ 树形 dp ] [ 贡献思维 ]
    一道很好的树形dp!!!!!树上染色。错误思路定义\(dp[u][i]\)表示以\(u\)为根的子树中,把\(i\)个点染成黑色的最大收益。但这样写,就在转移的时候必须枚举每一个点,复杂度过大,而且还不好写,是十分错误的写法。正确思路一般看到有关树上“路径”的题,就要把路径拆成一个个独立的......
  • DP选讲做题记录 by 付乙淼
    DP选讲P5074EattheTrees最简单的插头DP,轮廓线和插头可以很轻松存储状态和转移。P4719【模板】"动态DP"&动态树分治P5024[NOIP2018提高组]保卫王国动态DP一般就是简单的DP带单点修改,而且给你放到树上,这样你就不得不写树剖,写树剖就需要维护重链,我们就要写出也就是......
  • 音视频入门基础:WAV专题(2)——WAV格式简介
    注:本文有部分内容引用了维基百科:https://zh.wikipedia.org/wiki/WAV一、引言WaveformAudioFileFormat(缩写WAVE或WAV)是微软与IBM公司所开发在个人电脑存储音频流的编码格式,在Windows平台的应用软件受到广泛的支持。此格式属于资源交换文件格式(RIFF)的应用之一(关于RIFF格......
  • 【Azure APIM】调用APIM的备份接口时候遇见InvalidParameters错误
    问题描述根据官方文档,可以调用RESTAPI来对APIM执行备份操作。要备份API管理服务,请发出以下HTTP请求:POSThttps://management.chinacloudapi.cn/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.ApiManagement/service/{serviceN......
  • Android开发 - 存储辅助类 SharedPreferences 解析
    SharedPreferences简介SharedPreferences是Android平台上一个轻量级的存储辅助类,用来保存应用的一些常用配置。SharedPreferences的数据以键值对(key,val)的进行保存在以xml形式的文件中。在应用中通常做一些简单数据的持久化缓存从editor的put方法可以看出SharedPreferenc......
  • 可以捕捉高动态范围成像的的AR0521SR2C09SURA0-DP2、AR0522SRSM09SURA0-DP2、AR0821CS
    AR0521SR2C09SURA0-DP2、AR0522SRSM09SURA0-DP2、AR0821CSSC18SMEA0-DPBR图像传感器——明佳达1、AR0521SR2C09SURA0-DP2是一款1/2.5英寸CMOS数字图像传感器,带有2592(H)×1944(V)有效像素阵列。它能在线性或高动态范围模式下捕捉图像,且带有卷帘快门读取,其中包含了复杂......
  • 论文阅读:TKDP: Threefold Knowledge-Enriched Deep Prompt Tuning for Few-Shot Named
    将深度提示调优框架与三重知识(即TKDP)相结合,包括内部上下文知识和外部标签知识和语义知识。引言现有的少样本NER可分为3种:基于词-语义的方法、基于标签-语义的方法和基于提示的方法。基于词语义的方法完全依赖于输入词及其上下文。基于标签语义的方法需要额外利用标签知识。......