您的位置:首页 > 其它

【动态规划】【记忆化搜索】1017 乘积最大 2000年NOIP全国联赛普及组NOIP全国联赛提高组

2014-10-28 13:59 459 查看
跟CODEVS 3415没有什么区别,也不用高精度。
http://www.cnblogs.com/autsky-jadek/p/4055184.html
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,dp[41][41][7],ans=-10000000000000;
int m,wei,len;
const ll Base[]=
{1,10,100,1000,10000,100000,1000000,10000000,100000000,1000000000,
10000000000,100000000000,1000000000000,10000000000000,100000000000000,
1000000000000000,10000000000000000,100000000000000000,1000000000000000000};
ll Get_Part(const int &l,const int &r) {return n%Base[wei-l+1]/Base[wei-r];}
ll f(int sta,int end,int now)
{
if(dp[sta][end][now]!=-1) return dp[sta][end][now];
ll res=-10000000000000;
if(now==2) res=max(res,Get_Part(sta,end)*f(end+1,wei,now-1));
else
for(int i=end+1;i<=wei-(now-2);i++)
res=max(res,Get_Part(sta,end)*f(end+1,i,now-1));
return dp[sta][end][now]=res;
}
int main()
{
scanf("%d%d",&wei,&m); cin>>n; m++;
if(m==1)
{
printf("%lld\n",n);
return 0;
}
memset(dp,-1,sizeof(dp));
for(int i=1;i<=wei-m+1;i++)
dp[wei-i+1][wei][1]=Get_Part(wei-i+1,wei);
for(int i=1;i<=wei-m+1;i++)
ans=max(ans,f(1,i,m));
printf("%lld\n",ans);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐