0
点赞
收藏
分享

微信扫一扫

线性DP入门习题

陆佃 2022-03-12 阅读 50

有些题太简单了就没记录,像走方阵、走金字塔之类的

一、牛客NC21302 被3整除的子序列

二、牛客NC21303 删括号

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
using namespace std;
int dp[105][105]={1,};
char s[105],t[105];
int main(){
scanf("%s",s+1);
scanf("%s",t+1);
int n=strlen(s+1),m=strlen(t+1),cnt=0;
for(int i=1;i<=n;i++){
if(s[i]=='(') cnt--;
else cnt++;
if(cnt==0) dp[i][0]=1;
}
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++){
if(s[i]==t[j]) dp[i][j]|=dp[i-1][j-1];
if(s[i]==')'){
cnt=1;
for(int k=i-1;k>=1;k--){
if(s[k]==')') cnt++;
else cnt--;
if(cnt==0){
dp[i][j]|=dp[k-1][j];
break;
}
}
}
}
if(dp[n][m]) puts("Possible");
else puts("Impossible");
return 0;
}

三、牛客21313 美丽序列

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define M 1000000007
using namespace std;
int n,dp[40][41][1601][2],num,ll,rr,ans;
int main(){
scanf("%d %d",
if(num!=-1) dp[0][num][num][0]=1;
else for(int i=0;i<=40;i++) dp[0][i][i][0]=1;
for(int i=1;i<n;i++){
scanf("%d",
ll=0,rr=40;
if(num!=-1) ll=rr=num;
for(int j=ll;j<=rr;j++){
for(int k=j*(i+1);k<=1600;k++){
for(int l_old=0;l_old<2;l_old++)
for(int j_old=0;j_old<=j;j_old++)
dp[i][j][k][0]=(dp[i][j][k][0]+dp[i-1][j_old][k-j][l_old])%M;
for(int j_old=j+1;j_old<=40;j_old++)
dp[i][j][k][1]=(dp[i][j][k][1]+dp[i-1][j_old][k-j][0])%M;
}
}
}
for(int j=0;j<=40;j++)
for(int k=0;k<=1600;k++)
for(int l=0;l<2;l++)
ans=(ans+dp[n-1][j][k][l])%M;
printf("%d\n",ans);
return 0;
}

四、牛客21314 codeforces(01背包)

五、牛客21738 牛牛与数组

六、牛客21652 牛牛数括号(插入DP,重要结论)

七、牛牛去买球(01背包、背包细节、鸽巢原理)

#pragma GCC optimize("Ofast")
#include <bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int n,k,a[55],b[55],c[55],dp[20005],ans=inf;
int main(){
scanf("%d %d",
for(int i=0;i<n;i++) scanf("%d",
for(int i=0;i<n;i++) scanf("%d",
for(int i=0;i<n;i++) scanf("%d",
//a
memset(dp,inf,sizeof dp);
dp[0]=0;
for(int i=0;i<n;i++) for(int j=20000;j>=a[i]-1;j--)
dp[j]=min(dp[j],dp[j-a[i]+1]+c[i]);
for(int i=k;i<=20000;i++) ans=min(ans,dp[i]);
//b
memset(dp,inf,sizeof dp);
dp[0]=0;
for(int i=0;i<n;i++) for(int j=20000;j>=b[i]-1;j--)
dp[j]=min(dp[j],dp[j-b[i]+1]+c[i]);
for(int i=k;i<=20000;i++) ans=min(ans,dp[i]);
//ab鸽巢
memset(dp,inf,sizeof dp);
dp[0]=0;
for(int i=0;i<n;i++) for(int j=20000;j>=a[i]+b[i];j--)
dp[j]=min(dp[j],dp[j-a[i]-b[i]]+c[i]);
for(int i=2*k-1;i<=20000;i++) ans=min(ans,dp[i]);
printf("%d\n",ans==inf?-1:ans);
return 0;
}

八、POJ-1458、洛谷P1439(最长公共子序列 LCS)

九、POJ-1458(最长上升子序列 LIS)

十、leetcode-122 买卖股票的最佳时机 II

十一、leetcode-309 最佳买卖股票时机含冷冻期

十二、leetcode-714 买卖股票的最佳时机含手续费

十三、POJ-2479

十四、洛谷P1434

十五、洛谷P1280

十六、洛谷P2758

十七、洛谷P1233

十八、

举报

相关推荐

0 条评论