• wikioi 1017--乘积最大


    给定一个数串,以及K,求对这个数串K划分的乘积最大值。

    DP思路:一开始肯定想到的是递归,假设在某两个字符间有一个乘号,那么乘积最大就是乘号两边的区间接着划分的乘积最大值。

    于是状态空间表示如下dp[i][k]表示从0~i之间有K个乘号的乘积最大值,

    dp[i][k] = max(dp[j][k-1]*num[j+1][i])(k<=j<=i-1)

     1 #include <iostream>
     2 #include <queue>
     3 #include <climits>
     4 #include <algorithm>
     5 #include <memory.h>
     6 #include <stdio.h>
     7 #include <ostream>
     8 #include <vector>
     9 #include <list>
    10 #include <cmath>
    11 #include <string>
    12 using namespace std;
    13 
    14 int num[50][50];
    15 int dp[50][10];
    16 int main()
    17 {
    18     int N,K;
    19     string s;
    20     cin>>N>>K;
    21     cin>>s;
    22     int i,j;
    23     for(i = 0 ; i < N ; ++i)
    24     {
    25         int tmp = 0;
    26         for(j = i ; j < N ; ++j)
    27         {
    28             tmp = tmp*10+s[j]-'0';
    29             num[i][j] = tmp;
    30         }
    31     }
    32     memset(dp,0,sizeof(dp));
    33     for(j = 0; j < N ; ++j)
    34     {
    35         dp[j][0] = num[0][j];
    36     }
    37     for(j = 0; j < N ; ++j)
    38     {
    39         int k,t;
    40         for(k = 1;k <= K; ++k)
    41         {
    42             for(t = 0; t < j;++t)
    43             {
    44                 dp[j][k] = max(dp[t][k-1]*num[t+1][j],dp[j][k]);
    45             }
    46         }
    47     }
    48     cout<<dp[N-1][K]<<endl;
    49     return 0;
    50 }
  • 相关阅读:
    【做题笔记】P1531 I Hate It
    【做题笔记】[NOIOJ,非NOIp原题]装箱问题
    SPOJ1811 最长公共子串
    洛谷P3975
    AtCoder Regular Contest 099 E
    AtCoder Regular Contest 097 D
    AtCoder Regular Contest 098 E
    AtCoder Regular Contest 098 D
    AtCoder Regular Contest 099 C
    AtCoder Regular Contest 097 C
  • 原文地址:https://www.cnblogs.com/cane/p/3787628.html
Copyright © 2020-2023  润新知