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",&n,&num);
	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",&num);
		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",&n,&k);
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	for(int i=0;i<n;i++) scanf("%d",&b[i]);
	for(int i=0;i<n;i++) scanf("%d",&c[i]);
	//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 条评论