最大乘积(记忆化搜索)
生活随笔
收集整理的這篇文章主要介紹了
最大乘积(记忆化搜索)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題目描述
給一段數(shù)列,用k個(gè)乘號(hào)分開,求所得最大值
n<10!
解析
這樣就不用寫高精啦
枚舉第一個(gè)乘號(hào)的位置遞歸記憶化搜索即可
問題!
一開始邊界條件寫了一個(gè)這個(gè):
if(n-st<k) return -2e15;這樣使這樣的情況強(qiáng)制非法
但是這樣返回一個(gè)極大值再乘上一個(gè)大數(shù)就會(huì)爆ll!
其實(shí)返回0就行了
代碼
#include<bits/stdc++.h> using namespace std; #define ll long long int n,m; const int N=150; ll dp[N][N]; ll a[N]; char s[N]; ll zhi(int x,int y){ll ans=0;for(int i=x;i<=y;i++){ans*=10;ans+=a[i];}return ans; } ll find(int st,int k){if(dp[st][k]) return dp[st][k];if(n-st<k) return 0;if(k==0) return zhi(st,n);ll ans=0;for(int i=st+1;i<=n;i++){ans=max(ans,(ll)find(i,k-1)*zhi(st,i-1)); // printf("a=%lld b=%lld\n",find(i,k-1),zhi(st,i-1));} // printf("st=%d k=%d ans=%lld\n",st,k,ans);return dp[st][k]=ans; } int main(){scanf("%d%d\n",&n,&m);scanf(" %s",s+1);for(int i=1;i<=n;i++) a[i]=s[i]-'0';printf("%lld\n",find(1,m)); } /* 9 4 321044105 */總結(jié)
以上是生活随笔為你收集整理的最大乘积(记忆化搜索)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 播放4k视频电脑配置(4k视频 电脑配置
- 下一篇: 判断溢出(ybtoj-字符串)