- BC20260025's blog
水题合集
- 2024-2-26 11:53:32 @
A1263 友好城市
# include<iostream>
# include<map>
# include<algorithm>
using namespace std;
# define p pair<int,int>
# define m(a,b) make_pair(a,b)
const int N=5e3+5,M=1e4+5;
int n,a[N],dp[N],x,y,ans;
p f[N];
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>x>>y;
f[i]=m(x,y);
}
sort(f+1,f+n+1);
for(int i=1;i<=n;++i){
a[i]=f[i].second;
dp[i]=1;
}
for(int i=1;i<=n;++i)
for(int j=1;j<i;++j)
if(a[j]<=a[i])
dp[i]=max(dp[i],dp[j]+1);
for(int i=1;i<=n;++i) ans=max(ans,dp[i]);
cout<<ans;
return 0;
}
P1541 乌龟棋(B1167)
# include<iostream>
using namespace std;
const int N=355;
int n,m,a[N],b[5],t,ans;
int dp[N][45][45][45];
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=m;++i){
cin>>t;
++b[t];
}
for(int x=1;x<=n;++x)
for(int i=0;i<=b[2];++i)
for(int j=0;j<=b[3];++j)
for(int k=0;k<=b[4];++k){
int l=x-i*2-j*3-k*4-1;
int &f=dp[x][i][j][k];
if(l<0||l>b[1]) continue;
f=a[x];
if(i!=0&&x>2) f=max(f,dp[x-2][i-1][j][k]+a[x]);
if(j!=0&&x>3) f=max(f,dp[x-3][i][j-1][k]+a[x]);
if(k!=0&&x>4) f=max(f,dp[x-4][i][j][k-1]+a[x]);
if(l!=0&&x>1) f=max(f,dp[x-1][i][j][k]+a[x]);
}
for(int i=0;i<=b[2];++i)
for(int j=0;j<=b[3];++j)
for(int k=0;k<=b[4];++k){
int l=n-i*2-j*3-k*4-1;
int &f=dp[n][i][j][k];
if(l<0||l>b[1]) break;
ans=max(ans,f);
}
cout<<ans;
return 0;
}
改(记忆化搜索)
# include<iostream>
using namespace std;
const int N=355,M=45;
int n,m,a[N],t,b[5];
int dp[M][M][M][M];
int f(int x,int t1,int t2,int t3,int t4){
int &p=dp[t1][t2][t3][t4];
int m=0;
if(p!=0) return p;
if(x==1) return dp[0][0][0][0]=a[1];
if(t1>0) m=max(f(x-1,t1-1,t2,t3,t4),m);
if(t2>0) m=max(f(x-2,t1,t2-1,t3,t4),m);
if(t3>0) m=max(f(x-3,t1,t2,t3-1,t4),m);
if(t4>0) m=max(f(x-4,t1,t2,t3,t4-1),m);
return p=m+a[x];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=m;++i){
cin>>t;
b[t]++;
}
cout<<f(n,b[1],b[2],b[3],b[4]);
return 0;
}
P1049 装箱问题
# include<iostream>
# include<cstdio>
# include<cstring>
using namespace std;
int m,n,w[105],dp[20005];
int main(){
scanf("%d %d",&m,&n);
for(int i=0;i<n;++i) scanf("%d",w+i);
for(int i=0;i<n;++i){
for(int j=m;j>=w[i];--j) dp[j]=max(dp[j],dp[j-w[i]]+w[i]);
}
printf("%d",m-dp[m]);
return 0;
}
A1292 宠物小精灵之收服
# include<iostream>
using namespace std;
int n,m,p,a,b,c,r;
int dp[1005][505];
/*
使用至多i个精灵球,皮卡丘使用体力<=j时,
收服小精灵最多的数量
*/
int main(){
cin>>m>>p>>n;
for(int i=1;i<=n;++i){
cin>>a>>b;
for(int j=m;j>=a;--j)
for(int k=p;k>b;--k)
dp[j][k]=max(dp[j][k],dp[j-a][k-b]+1);
}
for(int i=1;i<=p;++i){
if(dp[m][i]>c){
c=dp[m][i];
r=i;
}
}
cout<<c<<" "<<p-r+1;
return 0;
}
A1299 糖果
# include<iostream>
using namespace std;
const int N=105;//糖果种数
int n,k,w;
int dp[N][N];
/*
前i件产品取部分总数量模k余j时
糖果总数的最大值
*/
int main(){
cin>>n>>k;
for(int i=1;i<k;++i)
dp[0][i]=-1e9;
for(int i=1;i<=n;++i){
cin>>w;
for(int j=0;j<k;++j)
dp[i][j]=max(dp[i-1][j],dp[i-1][((j-w)%k+k)%k]+w);
}
cout<<dp[n][0];
return 0;
}