hdu 4105 Electric wave(dp)

 

dp[i][j][0] 表示下标i到j的数作为波谷时得到的数的总个数,(所求空格数为空格-1), dp[i][j][1] 表示作为波峰时

 

cmp( i, j, l, r ) 比较 i到j 和 l到r 表示的数的大小, (i,j) < (l,r)返回0,(i,j) > (l,r)返回1,

 

如果cmp=0,(i,j)可以作为波谷, 所以 dp[i][j][0] = max( dp[i][j][0], dp[l][r][1] + 1 )

 

如果cmp=1,(i,j)可以作为波峰, 所以 dp[i][j][1] = max( dp[i][j][1], dp[l][r][0] + 1 )

 

 

#include
   
   
    
    
#include
    
    
     
     
#include
     
     
      
      
#include
      
      
       
       
#include
       
       
         #include 
        
          #include 
         
           #include 
          
            #include 
            #include 
            
              using namespace std; #define inf 0x3f3f3f3f #define eps 1e-8 #define maxn 2111 #define maxe 20003 #define mod 1000007 #define FOR(i,s,t) for(int i = s; i < t; i++ ) #define LL long long int #define ULL unsigned long long #define pii pair 
             
               #define lson id << 1 , l , m #define rson id << 1 | 1 , m + 1 , r int dp[111][111][2], a[111]; int cmp ( int i, int j, int l, int r ) { while( a[i] == 0 && i < j ) ++i ; while( a[l] == 0 && l < r ) ++l; if( j - i < r - l ) return 0; if( j - i > r - l ) return 1; while( i <= j ) { if( a[i] > a[l] ) return 1; if( a[i] < a[l] ) return 0; ++i, ++l; } return -1; } char s[111]; int main () { int n; while( scanf("%d", &n ) != EOF ) { scanf("%s", s ); for( int i = 0 ; i < n; i++ ) a[i] = s[i]-'0'; memset( dp, 0, sizeof( dp ) ); for( int i = 0; i < n; i++ ) dp[i][n-1][0] = dp[i][n-1][1] = 1; for( int i = n-2; i >= 0; i-- ) { for( int j = i; j < n-1; j++ ) { int l = j + 1; for( int r = l; r < n; r++ ) { int temp = cmp( i, j, l, r ); if( temp == 1 ) dp[i][j][1] = max( dp[i][j][1], dp[l][r][0] + 1 ); if( temp == 0 ) dp[i][j][0] = max( dp[i][j][0], dp[l][r][1] + 1 ); } } } int ans = 0; for( int i = 0 ; i < n; i++ ) ans = max( ans, dp[0][i][0] ); printf( "%d\n", ans - 1 ); } return 0; } 
              
             
           
          
         
       
      
      
     
     
    
    
   
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值