题目:
http://www.kuangbinoj.com:8080/problem.php?cid=1007&pid=1
题意:
n个数,m个乘号,求出将乘号放入n个数中得到的最大值。
思路:
DP。
dp[i][j]: 前i个数j个乘号得到的最大值。
AC.
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
char s[50];
int a[50];
int dp[50][50];
int dig(int i, int j)
{
int sum = 0;
for(int k = i; k <= j; ++k) {
sum = sum*10 + a[k];
}
return sum;
}
int main()
{
//freopen("in", "r", stdin);
int n, m;
while(~scanf("%d %d", &n, &m)) {
scanf("%s", s);
for(int i = 0; i < n; ++i) {
a[i] = s[i]-'0';
}
memset(dp, 0, sizeof(dp));
dp[0][0] = a[0];
for(int i = 1; i < n; ++i) {
dp[i][0] = dp[i-1][0]*10+a[i];
}
// for(int i = 0; i < n; ++i) {
// printf("%d ", dp[i][0]);
// }
// printf("\n");
for(int i = 0; i < n-1; ++i) {
for(int j = 0; j < m; ++j) {
for(int k = i+1; k < n; ++k) {
dp[k][j+1] = max(dp[k][j+1], dp[i][j]*dig(i+1, k));
}
}
}
printf("%d\n", dp[n-1][m]);
}
return 0;
}