ArcTan

dfs
随笔 - 16, 文章 - 117, 评论 - 6, 引用 - 0
数据加载中……

uva 12018 DP+离散化


题目大意:
      切水果游戏,在屏幕上任意时刻,你可以切掉屏幕上所有的水果。如果切掉的水果数大于2,那所得分就是水果数,否则为0.

      给n个水果序列[st,et]出现时间和结束时间,问最后最多能获得多少分。

DP+离散化(不懂什么叫离散化!)
      dp[i]=max{dp[j-1]+cute[j,i],1<=j<=i}
      以开始时间递增排序求cute[j,i]
#include<stdio.h>
#include
<string.h>
#include
<math.h>
int x[1005],y[1005],dp[1005];
int n,ans;
void qxsort(int l,int r)
{  
    
int i,j,mid,tmp;
    i
=l;
    j
=r;
    mid
=x[(i+j)/2];
    
while (i<=j)
    {
        
while (x[i]<mid)    i++;
        
while (x[j]>mid)    j--;
        
if (i<=j)
        {
            tmp
=x[i];
            x[i]
=x[j];
            x[j]
=tmp;
            tmp
=y[i];
            y[i]
=y[j];
            y[j]
=tmp;
            i
++;
            j
--;
        }
    }
    
if (l<j)    qxsort(l,j);
    
if (i<r)    qxsort(i,r);
}
int max(int a,int b)
{
    
if (a>b)
        
return a;
    
return b;
}
void work()
{
    
int i,j,s,now;
    memset(dp,
0,sizeof(dp));
    qxsort(
1,n);
    ans
=0;
    
for (i=3;i<=n ;i++ )
    {
        
if (i+1<=&& x[i]==x[i+1]) continue;
        s
=0;
        
for (j=i;j>=1 ;j-- )
        {
            
if (x[j]<=x[i] && y[j]>=x[i])    s++;
            now
=s;
            
if (now<3)
                now
=0;
            dp[i]
=max(dp[i],dp[j-1]+now);
        }
        ans
=max(ans,dp[i]);
    }
}
int main()
{
    
int t,i,cas=0;
    scanf(
"%d",&t);
    
while (t--)
    {
        scanf(
"%d",&n);
        
for (i=1;i<=n ;i++ )
            scanf(
"%d%d",&x[i],&y[i]);
        work();
        printf(
"Case #%d: %d\n",++cas,ans);
    }
    
return 0;
}

哎,真是弱爆了,看来dp题目真的很多很变态啊。要多想想了
还是,问题本质很重要!!!!

posted on 2012-05-09 21:28 wangs 阅读(256) 评论(0)  编辑 收藏 引用 所属分类: ACM-DP


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理