设为首页 加入收藏

TOP

HDU 4293 Groups(区间dp)
2015-11-21 00:56:54 来源: 作者: 【 】 浏览:2
Tags:HDU 4293 Groups 区间

HDU 4293

题意:有 n 个人,可任意分成若干组,然后每个人各提供一个信息,表示他们组前面有多少个人,后面有多少个人。问最多有多少个信息是真实的的。

思路:

这道题一开始给我的印象是什么乱七八糟的东西,后来也没想通到底该怎么做,好在赛后百度在手天下我有:)

我们可以把 这n个人看成一段区间 [1,n]。
设每个人的信息是a、b,则这个信息代表了他们组所在的区间 [a+1,n-b]。

若a+b>n,显然撒谎,跳过不做处理。

我们用一个Map[i][j]数组将同在一区间[i,j]的人数纪录下来,纪录过程中若Map[i][j] > n-i-j则说明提供[i,j]区间消息的人里有人撒谎,略过不计,令Map[i][j] = n-i-j;

问题转化成了在 [1,n] 这段区间中分布的若干个带有权值的区间,问如何选取一些不相交的区间,使权值之和最大。

我们用dp[i]表示[1,i]区间权值之和的最大值,转移方程为dp[i] = max(dp[i],dp[j]+map[j][i]).

?

code:

?

/*
* @author Novicer
* language : C++/C
*/
#include
  
   
#include
   
     #include
    
      #include
     
       #include
      
        #include
       
         #include
        
          #include
         
           #include
           #include
           
             #include
            
              #include
             
               #include
              
                #include
               
                 #include
                
                  #include
                 
                   #include
                  
                    #include
                   
                     #include
                    
                      #define INF 2147483647 #define cls(x) memset(x,0,sizeof(x)) #define rise(i,a,b) for(int i = a ; i <= b ; i++) using namespace std; const double eps(1e-8); typedef long long lint; const int maxn = 500 + 5; int Map[maxn][maxn]; int dp[maxn]; int main(){ // freopen(input.txt,r,stdin); int n; while(cin >> n){ cls(Map); for(int i = 1 ; i <= n ; i++){ int a,b; scanf(%d%d,&a,&b); if(a+b >= n) continue; else{ if(n-a-b > Map[a+1][n-b]) Map[a+1][n-b]++; else Map[a+1][n-b] = n-a-b; } } cls(dp); for(int i = 1 ; i <= n ; i++) for(int j = 1 ; j <= i ; j++) dp[i] = max(dp[i] , dp[j-1]+Map[j][i]); cout << dp[n] << endl; } return 0; } 
                    
                   
                  
                 
                
               
              
             
            
           
         
        
       
      
     
    
   
  


?

?

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇BNU Training 2015 07 27 题解 下一篇POJ 2417/BZOJ 3239(Discrete Log..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: