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 ;
}