https://cn.vjudge.net/contest/232326#problem/I
从左到右拿盘子,放置盘子的方式是从小到大,所以是最长上升子序列和最长下降子序列。。。。
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7ffffff
int a[505];
int b[505],c[505];
int main()
{
int i,j,n,k,ans,maxn;
while(~scanf("%d",&n)&&n)
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
ans=0;
for(i=n;i>0;i--)
{
maxn=1;
for(j=n;j>i;j--)
{
if(a[j]>=a[i])
{
maxn=max(maxn,b[j]+1);
}
}
b[i]=maxn;
maxn=1;
for(j=n;j>i;j--)
{
if(a[j]<=a[i])
{
maxn=max(maxn,c[j]+1);
}
}
c[i]=maxn;
}
for(i=1;i<=n;i++)
{
ans=max(ans,max(b[i],c[i]));
for(j=i+1;j<=n;j++)
{
if(a[i]>a[j])
ans=max(ans,b[i]+c[j]);
else
if(a[i]<a[j])
ans=max(ans,b[j]+c[i]);
}
}
printf("%d\n",ans);
}
}
https://cn.vjudge.net/contest/232326#problem/S
题意:
最长公共子序列可以转化为最长上升子序列
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7ffffff
int a[100005],b[100005],dp[100005];
int main()
{
int t,i,j,p,q,n,x,k,len;
k=0;
scanf("%d",&t);
while(t--)
{
memset(a,0,sizeof(a));
scanf("%d%d%d",&n,&p,&q);
for(i=0;i<=p;i++)
{
scanf("%d",&x);
a[x]=i;
}
len=1;
scanf("%d",&x);
dp[1]=a[x];
for(i=1;i<=q;i++)
{
scanf("%d",&x);
if(a[x]>dp[len])
{
dp[++len]=a[x];
}
else
{
int u;
u=lower_bound(dp+1,dp+len+1,a[x])-dp;
dp[u]=a[x];
}
}
k++;
printf("Case %d: %d\n",k,len);
}
}
https://cn.vjudge.net/contest/232326#problem/P
就是贪心查找最小的n组差,贪心是先排序,然后用一个dp就行了
代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define inf 0x7ffffff
double dp[505][505],a[505],b[505];
int main()
{
int n,i,j,m,k,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
scanf("%lf",&a[i]);
for(i=1;i<=m;i++)
scanf("%lf",&b[i]);
sort(a+1,a+n+1);
sort(b+1,b+1+m);
if(n<m)
{
dp[0][0]=0;
for(j=0;j<=m;j++)
dp[0][j]=0;
for(i=1;i<=n;i++)
for(j=0;j<=m;j++)
dp[i][j]=inf;
for(i=1;i<=n;i++)
{
int tt;
tt=m-(n-i);
for(j=i;j<=tt;j++)
{
dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]+abs(a[i]-b[j]));
}
}
printf("%.1f\n",dp[n][m]);
}
else
{
dp[0][0]=0;
for(j=0;j<=n;j++)
dp[0][j]=0;
for(i=1;i<=m;i++)
for(j=0;j<=n;j++)
dp[i][j]=inf;
for(i=1;i<=m;i++)
{
int tt;
tt=n-(m-i);
for(j=i;j<=tt;j++)
{
dp[i][j]=min(dp[i][j-1],dp[i-1][j-1]+abs(b[i]-a[j]));
}
}
printf("%.1f\n",dp[m][n]);
}
}
}