码蹄集部分题目(2024OJ赛8.14-8.18;线性DP)

1🐋🐋迷宫(黄金;线性DP)

时间限制:2秒

占用内存:128M

🐟题目思路

【码蹄集进阶塔全题解15】动态规划:MT2151 – MT2157_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
using namespace std;
const int N=3007;
const int mod=2333;
int n,m,ans,a[N][N],dp[N][N];
int main( )
{
    cin>>m>>n;
    for(int i=m;i>=1;i--)
    {
        for(int j=1;j<=n;j++) cin>>a[i][j];
    }
    dp[1][1]=1;
    for(int i=1;i<=m;i++)
    {
        for(int j=1;j<=n;j++)
        {
            if(!a[i][j])
            {
                dp[i][j]+=(dp[i-1][j]+dp[i][j-1]);
                dp[i][j]%=mod;
            }
        }
    }
    cout<<dp[m][n];
    return 0;
}

2🐋🐋抽奖(黄金;线性DP)

时间限制:1秒

占用内存:128M

🐟题目思路

【码蹄集进阶塔全题解15】动态规划:MT2151 – MT2157_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
using namespace std;
#define int long long
int n,dp[40][160],sum1,sum2,fenmu=1,temp;
int gcd(int a,int b) { return b==0?a:gcd(b,a%b);}
signed main( )
{
    cin>>n;
    dp[1][1]=dp[1][2]=dp[1][3]=dp[1][4]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=i;j<=4*n;j++)
        {
            for(int k=1;k<=4;k++)
            {
                if(j>k) dp[i][j]+=dp[i-1][j-k];
            }
        }
    }
    for(int i=n;i<2*n;i++) sum1+=dp[n][i];
    for(int i=3*n+1;i<=4*n;i++) sum2+=dp[n][i];
    for(int i=1;i<=n;i++) fenmu*=4;
    temp=gcd(sum1,fenmu);
    cout<<sum1/temp<<"/"<<fenmu/temp<<endl;
    temp=gcd(sum2,fenmu);
    cout<<sum2/temp<<"/"<<fenmu/temp;
    return 0;
}

3🐋🐋海龟(钻石;线性DP)

时间限制:1秒

占用内存:128M

🐟题目思路

【码蹄集进阶塔全题解15】动态规划:MT2151 – MT2157_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
using namespace std;
#define int long long
string s;
int dp[101][51][2],n,INF=0X3f3f3f3f;
signed main( )
{
    cin>>s>>n;
    int size=s.size();
    s=' '+s;
    for(int i=0;i<=size;i++)
    {
        for(int j=0;j<=n;j++) dp[i][j][0]=dp[i][j][1]=-INF;
    }
    dp[0][0][0]=dp[0][0][1]=0;
    for(int i=1;i<=size;i++)
    {
        for(int j=0;j<=n;j++)
        {
            for(int k=0;k<=j;k++)
            {
                if(s[i]=='F')
                {
                    if(k%2==1)
                    {
                        dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-k][0]);
                        dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-k][0]);
                    }
                    else
                    {
                        dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-k][0]+1);
                        dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-k][1]-1);
                    }
                }
                else if(k%2==1)
                {
                    dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-k][0]+1);
                    dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-k][1]-1);
                }
                else
                {
                    dp[i][j][0]=max(dp[i][j][0],dp[i-1][j-k][1]);
                    dp[i][j][1]=max(dp[i][j][1],dp[i-1][j-k][0]);
                }
            }
        }
    }
    cout<<max(dp[size][n][0],dp[size][n][1]);
    return 0;
}

4🐋🐋矩阵取数(钻石;线性DP)

时间限制:3秒

占用内存:128M

🐟题目思路

【码蹄集进阶塔全题解15】动态规划:MT2151 – MT2157_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
using namespace std;
int n,m,mod,ans,INF=0X3f3f3f3f;
int a[75][75],dp[75][75][75];
int main( )
{
    cin>>n>>m>>mod;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++) cin>>a[i][j];
    }
    memset(dp,-INF,sizeof(dp));
    dp[0][0][0]=0;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            if(j==1)
            {
                for(int k=0;k<=m/2;k++)
                {
                    for(int l=0;l<mod;l++)
                    {
                        dp[i][0][l]=max(dp[i][0][l],dp[i-1][k][l]);
                    }
                }
            }
            for(int k=m/2;k>=0;k--)
            {
                for(int l=0;l<mod;l++)
                {
                    dp[i][k+1][(l+a[i][j])%mod]=max(dp[i][k+1][(l+a[i][j])%mod],dp[i][k][l]+a[i][j]);
                }
            }
        }
    }
    for(int j=0;j<=m/2;j++) ans=max(ans,dp[n][j][0]);
    cout<<ans;
    return 0;
}

5🐋🐋异或和(钻石;线性DP)

时间限制:1秒

占用内存:128M

🐟题目思路

【码蹄集进阶塔全题解15】动态规划:MT2151 – MT2157_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
using namespace std;
const int N=1e5+7;
int n,a[N],dp[N];
int main( )
{
    memset(dp,0x3f3f3f,sizeof dp);
    dp[0]=0;
    cin>>n;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=550;j++)
        {
            if(dp[j]<a[i]) dp[j^a[i]]=min(dp[j^a[i]],a[i]);
        }
    }
    vector<int> ans;
    for(int i=0;i<=550;i++)
    {
        if(dp[i]!=0x3f3f3f3f) ans.push_back(i);
    }
    cout<<ans.size()<<endl;
    for(int id:ans) cout<<id<<" ";
    return 0;
}

6🐋🐋四柱河内塔(黄金;线性DP)

时间限制:1秒

占用内存:128M

🐟题目思路

【码蹄集进阶塔全题解15】动态规划:MT2151 – MT2157_哔哩哔哩_bilibili

🐟代码

#include<bits/stdc++.h> 
using namespace std;
int f,dp[55],INF=0x3f3f3f3f;
int main( )
{
    cin>>f;
    memset(dp,INF,sizeof(dp));
    dp[0]=0,dp[1]=1,dp[2]=3;
    cout<<1<<endl<<3<<endl;
    for(int x=3;x<=f;x++)
    {
        for(int k=1;k<x;k++)
        {
            if(dp[x]>2*dp[x-k]+pow(2,k)-1) dp[x]=2*dp[x-k]+pow(2,k)-1;
        }
        cout<<dp[x]<<endl;
    }
    return 0;
}

⭐这周没有写题解,需要的宝子看下链接里的视频讲解~

⭐创作不易,点个赞吧~

⭐点赞收藏不迷路~

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值