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;
}
本文介绍了一种使用动态规划(DP)算法解决特定问题的方法:在一个包含n个人的群体中,已知每个人对于是否说真话的情况,如何确定在任意指定的j个人中,最多有多少人可以说真话?算法通过构建状态转移方程,优化了求解过程,并通过实例演示了解题步骤。
3万+

被折叠的 条评论
为什么被折叠?



