<划分型DP>【noip 2000】乘积最大
来源:互联网 发布:倩女幽魂2知乎 编辑:程序博客网 时间:2024/05/09 20:08
非高精版
高精版
dp[i][j]:前i个数添加j个乘号能得到的最大的乘积
转移时,要枚举前i个数中最后一个乘号的位置
codevs上的数据比较水,连long long都不用开
codevs非高精版代码:
#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;int n,K;char s[50],num[50];int dp[50][10];int cal(int l,int r){ int ans=0,m=1; for(int i=r;i>=l;--i) { ans+=num[i]*m; m*=10; } return ans;}int main(){ cin>>n>>K;; for(int i=1;i<=n;++i) { cin>>s[i]; num[i]=s[i]-'0'; } for(int i=1;i<=n;++i) dp[i][0]=cal(1,i); for(int i=1;i<=n;++i) for(int j=1;j<=K&&j<i;++j) for(int k=j;k<i;++k) dp[i][j]=max(dp[i][j],dp[k][j-1]*cal(k+1,i)); cout<<dp[n][K]; return 0;}
洛谷高精版代码:
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=100;int n,K;string s;int a[maxn];struct lxt{ int len; int ans[maxn];}dp[maxn/10][maxn];lxt cal(lxt x,int l,int r){ lxt Ans,y; memset(Ans.ans,0,sizeof(Ans.ans)); memset(y.ans,0,sizeof(y.ans)); y.len=r-l+1; for(int i=r;i>=l;--i) y.ans[r-i+1]=a[i]; int l1=x.len,l2=y.len,ll; for(int i=1;i<=l1;++i) for(int j=1;j<=l2;++j) Ans.ans[i+j-1]+=x.ans[i]*y.ans[j]; ll=l1+l2-1; for(int i=1;i<=ll;++i) { Ans.ans[i+1]+=Ans.ans[i]/10; Ans.ans[i]=Ans.ans[i]%10; } if(Ans.ans[ll+1]) ll++; Ans.len=ll; return Ans;}lxt cmp(lxt x,lxt y){ int lx=x.len,ly=y.len; if(lx<ly) return y; if(lx>ly) return x; for(int i=lx;i>=1;--i) { if(x.ans[i]>y.ans[i]) return x; if(x.ans[i]<y.ans[i]) return y; } return x; }int main(){ scanf("%d%d",&n,&K); cin>>s; for(int i=1;i<=n;++i) a[i]=s[i-1]-'0'; for(int i=1;i<=n;++i) for(int j=i;j>=1;--j) dp[0][i].ans[++dp[0][i].len]=a[j]; for(int i=2;i<=n;++i) for(int k=1;k<=min(K,i-1);++k) for(int j=k;j<i;++j) dp[k][i]=cmp(dp[k][i],cal(dp[k-1][j],j+1,i)); for(int i=dp[K][n].len;i>=1;--i) printf("%d",dp[K][n].ans[i]); return 0;}
PS:高精乘高精还是调了一段时间的
阅读全文
0 0
- <划分型DP>【noip 2000】乘积最大
- NOIP 2000乘积最大 解题报告(划分型DP)
- 【划分型DP】乘积最大
- NOIP 乘积最大(dp)
- noip 2000年 乘积最大 - DP
- NOIP 2000 乘积最大
- Noip 2000 乘积最大
- noip 2000 乘积最大
- Code[VS] 1017 乘积最大 (划分型DP)
- RQNOJ 311 [NOIP2000]乘积最大:划分型dp
- noip-2000乘积最大 2008.11.5
- [NOIP提高组2000]乘积最大
- NOIP 2000普及组 乘积最大 详解
- RQNOJ311&&NOIP 乘积最大
- POJ1651 Codevs1017 乘积最大 ---2000年NOIP全国联赛提高组 dp
- 区间DP——整数划分(使乘积最大)
- wikioi-天梯-普及一等-划分dp-1017:乘积最大
- 【日常学习】【划分DP】codevs1017 乘积最大题解
- ngnix高可靠网站架构
- 大文件分块上传以及断点续传
- Java 视图
- hdu 1166 简单线段树
- 玲珑杯
- <划分型DP>【noip 2000】乘积最大
- ssh免密码访问
- 在url路径直接向Servlet传json字符串解析报错The valid characters are defined in RFC 7230 and RFC
- 直接插入排序算法图解
- C# lock string 字符串 "暂留"
- git创建仓库步骤
- windown server 环境中使用rman备份到网络共享文件夹.
- spring-batch预研篇
- 回顾大一·C语言编程4.3(2)