题目链接 | 难度等级 | 完成状态 | 完成分数 | 最后编辑时间 | 需要注意 |
---|---|---|---|---|---|
乘积最大 | ★☆☆☆☆ | 答案正确 | 100 | 2015-1-24 20:14:11 | 无 |
一串数字在中间添若干个乘号,问结果最大值。
dp[1][cut][k]=max{dp[1][cut-length][k-1]*cut点处前length个数的乘积};//由于[1]和[k]维度的单调性可以略去以节省空间
1017 .cpp代码已折叠
展开折叠内容
|
---|
#include<cstdio> #include<algorithm> long long N,K; char a[100]={}; long long dp[100]={}; const long long getNum(const long long &_from,const long long &_to) { long long $t=0; for(long long i=_from;i<=_to;++i) { $t*=10; $t+=a[i]; } return $t; } int main() { scanf("%lld%lld\n",&N,&K); for(long long i=1;i<=N;++i) { scanf("%c",&a[i]); a[i]-='0'; dp[i]=getNum(1,i); } for(long long k=1;k<=K;++k) { for(long long cut=N;cut>=1;--cut) { dp[cut]=0; for(long long length=1;cut-length>0;++length) { dp[cut]=std::max(dp[cut],dp[cut-length]*getNum(cut-length+1,cut)); } } } printf("%lld\n",dp[N]); return 0; } |