HDU 4293 Groups
2012-09-18 09:38
330 查看
题意: 有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])
分析: 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 ); } return 0; }
相关文章推荐
- HDU 4293 Groups [DP]
- HDU 4293 Groups(线性)
- HDU 4293Groups(DP)
- HDU 4293 Groups (dp)
- HDU - 4293 Groups (DP)
- HDU 4293 Groups(区间DP)
- HDU 4293 Groups
- HDU 4293--Groups
- HDU 4293 Groups 区间覆盖 区间DP
- HDU 4293 Groups(区间dp)
- hdu 4293 Groups
- HDU 4293 Groups(12年成都网络赛-F题-DP)
- hdu 4293 Groups (2012 ACM/ICPC Asia Regional Chengdu Online)
- hdu 4293 Groups
- HDU 4293 Groups【区间dp】
- HDU 4293 Groups
- HDU 4293 Groups
- hdu 4293 Groups
- hdu 4293 Groups
- hdu 4293 Groups