HDU 4293 Groups
题意: 有n 个人走在一条路上,其中一些人可能是一个组的,每个人都说出了自己所在组前方的人数和后方的人数,问最多有多少人说的是真话。
分析: dp[i][j] 表示从第 i +1 个人到第 j 个人为一组时的最优值
t[i][j] 表示描述中从第 i +1 个人到第 j 个人为一组的数量
注意的是: t[i][j]的值不可能超过 n-(j-i+1)
s[i] 保存以第 i 个人为结尾的最优值
转移方程: dp[i][j]=s[i]+t[i][j]
s[j] = max (s[j],dp[i][j])
#include<stdio.h> #include<string.h> #define clr(x)memset(x,0,sizeof(x)) #define max(a,b)(a)>(b)?(a):(b) #define maxn 505 int dp[maxn][maxn]; int t[maxn][maxn]; int s[maxn]; int main() { int n,i,j; while(scanf("%d",&n)!=EOF) { int a,b; clr(dp); clr(t); clr(s); for(i=1;i<=n;i++) { scanf("%d%d",&a,&b); if(a+b<n&&t[a][n-b]<n-a-b) t[a][n-b]++; } for(j=1;j<=n;j++) for(i=0;i<j;i++) { dp[i][j]=s[i]; dp[i][j]+=t[i][j]; if(dp[i][j]>s[j]) s[j]=dp[i][j]; } printf("%d\n",s[n]); } return 0; }