洛谷P1018 乘积最大
当时看到这个题很懵逼,暴力不好打,也不是很有效,dp也没思路。。然后看了题解。。f[i][j]表示在序列中前i个数中加入j个乘号的最大乘积,要在序列中枚举从j-1到i的第j个乘号所在的位置,这里要前缀和优化,答案就是f[n][k]。
#include<bits/stdc++.h> using namespace std; long long f[100][10]; char a[100]; long long num[100][100]; string s; int n,k; int main() { cin>>n>>k; cin>>a; for(int i=1;i<=n;i++) num[i][i]=(int)a[i-1]-48; for(int i=1;i<n;i++) for(int j=i+1;j<=n;j++) num[i][j]+=num[i][j-1]*10+(int)a[j-1]-48; for(int i=1;i<=n;i++) f[i][0]=num[1][i]; for(int i=1;i<=n;i++) for(int k1=1;k1<=k;k1++) { if(k1>=i)break; for(int j=k1;j<=i-1;j++) { f[i][k1]=max(f[i][k1],f[j][k1-1]*num[j+1][i]); } } cout<<f[n][k]; return 0; }