动态规划专项intermediate:UVa 11766

来源:互联网 发布:淘宝首页自定义优惠券 编辑:程序博客网 时间:2024/05/16 11:00

这道题关键就是模型的转化,只要把a、b两个值转化为一个[a+1,n-b]的区间问题就很容易考虑了。这样问题就变成了求区间[1,n]上无重叠部分区间的最大值,但有一点不同的是,完全相同的区间最多可以取区间长度个,即n-a-b个。最后,n减去dp所得的值即为结果。

#include <iostream>#include <cstdio>#include <cstring>#include <algorithm>using namespace std;struct car{    int a,b;    bool operator<(const car& tmp) const    {        return a<tmp.a||(a==tmp.a&&b<tmp.b);    }} c[1010];int n,m;int dp[1010][1510];int vis[1010][1510];int dfs(int cur,int end){    if(cur==m) return 0;    if(vis[cur][end]) return dp[cur][end];    vis[cur][end]=1;    int &ans=dp[cur][end];    int cnt=1;    for(int i=cur+1;i<m;i++)       if(c[cur].a==c[i].a&&c[cur].b==c[i].b) cnt++;       else break;    ans=dfs(cur+cnt,end);    if(c[cur].a+1>end) ans=max(ans,dfs(cur+cnt,n-c[cur].b)+min(cnt,n-c[cur].a-c[cur].b));    return ans;}int main(){    freopen("in.txt","r",stdin);    int kase=1;    while(cin>>n&&n)    {        m=0;        for(int i=0;i<n;i++)        {            int a,b;            cin>>a>>b;            if(a+b>=n) continue;            c[m].a=a;c[m++].b=b;        }        sort(c,c+m);        memset(vis,0,sizeof(vis));        cout<<"Case "<<kase++<<": ";        cout<<n-dfs(0,0)<<endl;    }    return 0;}


原创粉丝点击