HDU 4293 Groups

来源:互联网 发布:淘宝618大促报名 编辑:程序博客网 时间:2024/05/21 17:29

题意:N个人沿着一条路一起去食堂,其中有些人排成一排,每个人报出两个数ai,bi,分别指他前面有多少人后面有多少人(和他一排的人不算在前面或后面),但有些人可能会说错,问最好的情况下最多有多少人说对。


分析:每个人报出两个数ai,bi,则该人就在区间[ai+1,n-bi]中,设sec[i][j]指区间[i,j]中说对的最多人数,dp[i]指以第i个人结尾的说对的最多人数,则dp[i]=max(dp[i],dp[j]+sec[j][n-i]) (0<=j<i)。


Code :

#include <algorithm>#include <iostream>#include <cstring>#include <string>#include <cstdio>#include <vector>#include <queue>#include <cmath>#include <map>#include <set>#define eps 1e-7#define LL long long#define pb push_back#define Max(a,b) ((a)>(b)?(a):(b))#define Min(a,b) ((a)<(b)?(a):(b))using namespace std;const int maxn=505;int dp[maxn],sec[maxn][maxn];int n;int main(){    while(scanf("%d",&n)==1){        int f,b;        memset(sec,0,sizeof(sec));        for(int i=1;i<=n;i++){            scanf("%d %d",&f,&b);            if(f+b>=n) continue;            sec[f][b]=Min(sec[f][b]+1,n-f-b);        }        memset(dp,0,sizeof(dp));        for(int i=1;i<=n;i++){            for(int j=0;j<i;j++)                dp[i]=Max(dp[i],dp[j]+sec[j][n-i]);        }        printf("%d\n",dp[n]);    }    return 0;}


原创粉丝点击