南陽理工oj 746 整數劃分(四) 區間dp


http://acm.nyist.net/JudgeOnline/problem.php?pid=746


區間dp


#include <bits/stdc++.h>


using namespace std ;
typedef long long ll ;

char read[40] ;
int re[40] ;
ll val[40][40] ;
ll dp[40][40] ;
int main(){
    int T ; scanf("%d" , &T) ;
    while(T --){
        ll b ;
        memset(read ,0 , sizeof(read)) ; memset(re , 0 , sizeof(re)) ;
        scanf("%s %lld" , read , &b) ;
        int len = strlen(read) ;
        ll ans = 0 ;
        b -- ;
        for(int i = 0 ; i < len ; i ++ ) re[i] = read[i] - '0' ;
        memset(val , 0 , sizeof(val)) ; memset(dp , 0 , sizeof(dp)) ;
        for(int i = 0 ; i < len ; i ++ ){
            val[i][i] = re[i] ;
            for(int j = i + 1 ; j < len ; j ++ ){
                val[i][j] = val[i][j-1]*10 + re[j] ;
            }
        }
        for(int i = 0 ; i < len ; i ++ ) dp[i][0] = val[0][i] ;
        for(int mul = 1 ; mul <= b ; mul ++ ){
            for(int r = mul ; r < len ; r ++ ){///at least the blank for multiply
                for(int l = 0 ; l < r ;l ++ ){
                    dp[r][mul] = max(dp[r][mul] , dp[l][mul-1] * val[l+1][r]) ;
                }
            }
        }
        printf("%d\n" , dp[len-1][b]) ;

    }
    return 0 ;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章