dp,dp[i][j]为前j个人中,i+1到j为一组时,说真话的最大人数。注意预判同一组人数个数是否超出组内人数上限。
#include<cstdio>
#include<cstring>
#define nMax 505
int a[nMax][nMax],dp[nMax][nMax],s[nMax];
int main()
{
int i,j,x,y,n,ans;
while(~scanf("%d",&n))
{
memset(a,0,sizeof(a));
memset(s,0,sizeof(s));
for(i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
if(x+y<n)
{
a[x][y]++;
}
if(a[x][y]>n-x-y)
{
a[x][y]=n-x-y;
}
}
ans=0;
memset(dp,0,sizeof(dp));
for(j=1;j<=n;j++)
{
for(i=0;i<j;i++)
{
dp[i][j]=s[i]; //s[i]表示1到i说真话的人数
dp[i][j]+=a[i][n-j];
if(dp[i][j]>s[j])
{
s[j]=dp[i][j];
}
}
}
for(i=0;i<n;i++)
{
if(ans<dp[i][n])
{
ans=dp[i][n];
}
}
printf("%d\n",ans);
}
return 0;
}