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;
}
⭐这周没有写题解,需要的宝子看下链接里的视频讲解~
⭐创作不易,点个赞吧~
⭐点赞收藏不迷路~