大意:给出N个人,分成若干个团队,然后第i个人说出自己团队前面又Ai个人以及自己团队后面有Bi个人。问最多能让多少个人说的话正确。
哎,英语渣,大概就这样了。
一开始看题目,觉得看错题,坑了很久,然后跟师兄交流一下意见,果然看错了,无语。
我的思路就是转化成0/1背包,因为每个人都有正确/不正确的选择,因为要取正确的最大,所以如果Ai=Aj而且Bi=Bj,那么背包(Ai,Bi)价值就+1。然后背包容量就是背包所能容纳的最大人数,价值就是存在背包中的真实人数,注意背包放置的位置是固定的,因为前面必须有Ai个人,说的不太清楚,大概就这样吧。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
using namespace std;
#define N 505
#define inf -1000000000
int dp[N];
int s[N][N];
int main()
{
int n,i,j,maxx,a,b;
while(cin>>n)
{
memset(dp,0,sizeof(dp));
memset(s,0,sizeof(s));
for(i=0;i<n;i++)
{
cin>>a>>b;
if(s[a][b]<n-a-b)
s[a][b]++;
}
for(i=0,maxx=inf;i<=n;i++)
{
for(j=0;j+i<n;j++)
{
dp[n-j]=max(dp[n-j],dp[i]+s[i][j]);
maxx=max(dp[n-j],maxx);
}
}
cout<<maxx<<endl;
}
return 0;
}