摘要

题目链接 难度等级 完成状态 完成分数 最后编辑时间 需要注意
乘积最大 ★☆☆☆☆ 答案正确 100 2015-1-24 20:14:11


题意

一串数字在中间添若干个乘号,问结果最大值。

题解

  • DP,方程为:
显示/移除行号
  1. dp[1][cut][k]=max{dp[1][cut-length][k-1]*cut点处前length个数的乘积};//由于[1]和[k]维度的单调性可以略去以节省空间

代码

1017 .cpp代码已折叠
展开折叠内容
显示/移除行号
  1. #include<cstdio>
  2. #include<algorithm>
  3. long long N,K;
  4. char a[100]={};
  5. long long dp[100]={};
  6. const long long getNum(const long long &_from,const long long &_to)
  7. {
  8. long long $t=0;
  9. for(long long i=_from;i<=_to;++i)
  10. {
  11. $t*=10;
  12. $t+=a[i];
  13. }
  14. return $t;
  15. }
  16. int main()
  17. {
  18. scanf("%lld%lld\n",&N,&K);
  19. for(long long i=1;i<=N;++i)
  20. {
  21. scanf("%c",&a[i]);
  22. a[i]-='0';
  23. dp[i]=getNum(1,i);
  24. }
  25. for(long long k=1;k<=K;++k)
  26. {
  27. for(long long cut=N;cut>=1;--cut)
  28. {
  29. dp[cut]=0;
  30. for(long long length=1;cut-length>0;++length)
  31. {
  32. dp[cut]=std::max(dp[cut],dp[cut-length]*getNum(cut-length+1,cut));
  33. }
  34. }
  35. }
  36. printf("%lld\n",dp[N]);
  37. return 0;
  38. }
  39.  

著作权声明[编辑]

关于[编辑]