zoukankan      html  css  js  c++  java
  • hdu3565 Bi-peak Number (有上界和下界的数位dp)

    Problem Description
    A peak number is defined as continuous digits {D0, D1 … Dn-1} (D0 > 0 and n >= 3), which exist Dm (0 < m < n - 1) satisfied Di-1 < Di (0 < i <= m) and Di > Di+1 (m <= i < n - 1).
    A number is called bi-peak if it is a concatenation of two peak numbers.



    The score of a number is the sum of all digits. Love8909 is crazy about bi-peak numbers. Please help him to calculate the MAXIMUM score of the Bi-peak Number in the closed interval [A, B].
     

    Input
    The first line of the input is an integer T (T <= 1000), which stands for the number of test cases you need to solve.
    Each case consists of two integers “A B” (without quotes) (0 <= A <= B < 2^64) in a single line.
     

    Output
    For the kth case, output “Case k: v” in a single line where v is the maximum score. If no bi-peak number exists, output 0.
     

    Sample Input
    3 12121 12121 120010 120010 121121 121121
     

    Sample Output
    Case 1: 0 Case 2: 0 Case 3: 8
    题意:定义"特殊数"为两次先上升后下降形成的数,且第一位大于等于0,没有前导零,问所有满足条件的数中,位数和最大的是多少。
    思路:可以把两座山峰看做7个状态,0:还没有到第一个山的上坡 1:到了第一个山的上坡,但是还不能“转弯”,即不能向下折,后面也类似 2:任然是第一个山的山坡,但是可以“转弯” 3:到了第一个山坡的下坡,且可以“转弯” 4:到了第二个山的上坡,但是还不能“转弯” 5:到了第二个山的的上坡,且可以转弯 6:到了第二个山的下坡。
    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<string>
    #include<bitset>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    typedef unsigned long long ull;
    #define inf 99999999
    #define MOD 1000000007
    int wei1[100],wei2[100];
    int dp[100][10][8];
    
    int dfs(int pos,int pre,int state,int flag1,int flag2)
    {
        int i,j;
        if(pos==0){
            if(state==6)return 0;
            return -inf;
        }
        if(!flag1 && !flag2 && dp[pos][pre][state]!=-1){
            return dp[pos][pre][state];
        }
        int min1=flag1?wei1[pos]:0;
        int max1=flag2?wei2[pos]:9;
        int ans=-inf;
        for(i=min1;i<=max1;i++){
            if(state==0){
                if(i>0){
                    ans=max(ans,i+dfs(pos-1,i,1,flag1&&i==min1,flag2&&i==max1) );
                }
                else if(i==0)ans=max(ans,0+dfs(pos-1,i,0,flag1&&i==min1,flag2&&i==max1));
            }
            else if(state==1){
                if(i>pre){
                    ans=max(ans,i+dfs(pos-1,i,2,flag1&&i==min1,flag2&&i==max1));
                }
            }
            else if(state==2){
                if(i>pre){
                    ans=max(ans,i+dfs(pos-1,i,2,flag1&&i==min1,flag2&&i==max1));
                }
                if(i<pre){
                    ans=max(ans,i+dfs(pos-1,i,3,flag1&&i==min1,flag2&&i==max1 ) );
                }
            }
    
            else if(state==3){
                if(i<pre){
                    ans=max(ans,i+dfs(pos-1,i,3,flag1&&i==min1,flag2&&i==max1 ) );
                }
                if(i>0){
                    ans=max(ans,i+dfs(pos-1,i,4,flag1&&i==min1,flag2&&i==max1 ) );
                }
    
            }
            else if(state==4){
                if(i>pre){
                    ans=max(ans,i+dfs(pos-1,i,5,flag1&&i==min1,flag2&&i==max1));
                }
            }
            else if(state==5){
                if(i>pre){
                    ans=max(ans,i+dfs(pos-1,i,5,flag1&&i==min1,flag2&&i==max1));
                }
                if(i<pre){
                    ans=max(ans,i+dfs(pos-1,i,6,flag1&&i==min1,flag2&&i==max1 ) );
                }
    
            }
            else if(state==6){
                if(i<pre){
                    ans=max(ans,i+dfs(pos-1,i,6,flag1&&i==min1,flag2&&i==max1) );
                }
            }
        }
        if(!flag1 && !flag2){
            dp[pos][pre][state]=ans;
        }
        return ans;
    }
    
    int main()
    {
        ull m,n;
        int T,i,j,cas=0;
        memset(dp,-1,sizeof(dp));
        scanf("%d",&T);
        while(T--)
        {
            cin>>m>>n;
            int len=0;
            while(n){
                len++;
                wei2[len]=n%10;
                n/=10;
                wei1[len]=m%10;
                m/=10;
            }
            int ans=dfs(len,0,0,1,1);
            if(ans<0)ans=0;
            printf("Case %d: %d
    ",++cas,ans);
        }
        return 0;
    }
    


  • 相关阅读:
    OCP-1Z0-051-V9.02-118题
    VC++ 获取临时目录
    VC++ UUID/GUID
    MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
    Win32 SDK程序中拖动Thin边框窗口来改变窗口大小
    HTML5 App实战(7):连连看
    MFC对话框Border类型(None、Thin、Resizing、Dialog Frame)对应的部分属性
    项目报错七
    Linux下如何查看高CPU占用率线程
    项目报错六
  • 原文地址:https://www.cnblogs.com/herumw/p/9464497.html
Copyright © 2011-2022 走看看