南陽理工oj 746 整數劃分(四) 區間dp
阿新 • • 發佈:2019-02-14
區間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 ; }