题目描述
给一段数列,用k个乘号分开,求所得最大值
n<10!
解析
这样就不用写高精啦
枚举第一个乘号的位置递归记忆化搜索即可
问题!
一开始边界条件写了一个这个:
if(n-st<k) return -2e15;
这样使这样的情况强制非法
但是这样返回一个极大值再乘上一个大数就会爆ll!
其实返回0就行了
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;
const int N=150;
ll dp[N][N];
ll a[N];
char s[N];
ll zhi(int x,int y){ll ans=0;for(int i=x;i<=y;i++){ans*=10;ans+=a[i];}return ans;
}
ll find(int st,int k){if(dp[st][k]) return dp[st][k];if(n-st<k) return 0;if(k==0) return zhi(st,n);ll ans=0;for(int i=st+1;i<=n;i++){ans=max(ans,(ll)find(i,k-1)*zhi(st,i-1));
// printf("a=%lld b=%lld\n",find(i,k-1),zhi(st,i-1));}
// printf("st=%d k=%d ans=%lld\n",st,k,ans);return dp[st][k]=ans;
}
int main(){scanf("%d%d\n",&n,&m);scanf(" %s",s+1);for(int i=1;i<=n;i++) a[i]=s[i]-'0';printf("%lld\n",find(1,m));
}
/*
9 4
321044105
*/