乘積最大<DP><C++>

題目

  • 題目:給出一個長度爲n的數.問:如何在數中添加k個乘號,使乘積最大?輸出這個最大值.
  • 輸入格式:
    • 第一行,輸入兩個數n,k,中間有空格隔開.
    • 第二行,輸入這個長度爲n的數.
  • 輸出格式:僅有一行,輸出最大值.
  • 例子:
    • input:
    • 4 2
    • 1231
    • output:
    • 62

分析

  • 我們用f[i][j][k]來表示數的每一個數字組成的區間[i,j]中加入k個乘號的最大乘積,定義一個指針u來枚舉區間[i,j)中的每一個位置,則動態轉移方程爲f[i][j][k]=max(f[i][j][k],f[i][u][k-1]*f[u+1][j][0]),則我們要求的最大值,就保存在f[0][n-1][k]中.

程序

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
int main(){
    int n,k;
    scanf("%d%d",&n,&k);
    char a[n],s[1];
    gets(s),gets(a);
    long long f[n][n][k+1],to;
    memset(f,0,sizeof(f));
    for(int i=0;i<=n-1;i++)
        for(int j=i;j<=n-1;j++){
            to=1;
            for(int t=j;t>=i;t--)
                f[i][j][0]+=(a[t]-'0')*to,to*=10;
        }
    for(int k0=1;k0<=k;k0++)
        for(int i=0;i<=n-1-k0;i++)
            for(int j=i+k0;j<=n-1;j++)
                for(int u=i;u<=j-1;u++)
                    f[i][j][k0]=max(f[i][j][k0],f[i][u][k0-1]*f[u+1][j][0]);
    printf("%I64d",f[0][n-1][k]);
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章