P1018 乘积最大
2017-06-02 17:29
169 查看
https://www.luogu.org/problem/show?pid=1018#sub
其实这个数据范围貌似搜索是过不了的,但是在lg上过了
这里搜索的方法是,dfs(int x,LL ans,int bef),x表示已经用了几个乘号,ans表示前面放完乘号得到的乘积,bef表示上一个乘号放的位置(后面);
那么,如果x< k,把bef和当前要放的位置之间的数乘进ans;
放完最后一个,要把后面剩下的数乘进ans;
而且,放第x个乘号时,位置不能大于n-k+x,因为要给后面的乘号留下足够的位置。
其实这个数据范围貌似搜索是过不了的,但是在lg上过了
这里搜索的方法是,dfs(int x,LL ans,int bef),x表示已经用了几个乘号,ans表示前面放完乘号得到的乘积,bef表示上一个乘号放的位置(后面);
那么,如果x< k,把bef和当前要放的位置之间的数乘进ans;
放完最后一个,要把后面剩下的数乘进ans;
而且,放第x个乘号时,位置不能大于n-k+x,因为要给后面的乘号留下足够的位置。
#include<iostream> #include<cstdio> #define LL long long using namespace std; int n,k,a[50]; LL maxn; void dfs(int x,LL ans,int bef) { if(x==k) { LL num=0; for(int i=bef+1;i<=n;i++) { num=num*10+a[i]; } maxn=max(maxn,ans*num); return; } for(int i=bef+1;i<=n-k+x;i++) { LL num=0; for(int p=bef+1;p<=i;p++) num=num*10+a[p]; dfs(x+1,ans*num,i); } return; } int main() { scanf("%d%d\n",&n,&k); for(int i=1;i<=n;i++) { char o; cin>>o; a[i]=o-'0'; } dfs(0,1,0); printf("%lld",maxn); return 0; }
相关文章推荐
- AC日记——乘积最大 洛谷 P1018
- 洛谷 P1018 乘积最大(NOIp2000提高组第二题)
- 洛谷 P1018 乘积最大
- [NOIP2000] 提高组 洛谷P1018 乘积最大
- 洛谷 P1018 [NOIP2000 T2] 乘积最大
- P1018 乘积最大
- 【DP】洛谷 P1018 乘积最大
- (ssl1007)P1018 2000年分区联赛普级组之三 乘积最大
- 洛谷 P1018 乘积最大
- P1018 乘积最大
- P1018 乘积最大
- 洛谷—— P1018 乘积最大
- 携程4月11日编程题 输出最大乘积 java
- 暴力求解最大乘积
- 洛谷P1887 乘积最大3
- Leetcode 152 Maximum Product Subarray 子数组最大乘积
- noip2000乘积最大c++
- 最大子数组乘积 c++
- lintcode刷题——乘积最大子序列
- COJ 1026 乘积最大 DP+高精度