QUST日常訓練(1)積最大

2497 ワード

タイトルの説明


多くの学校では比較的な習慣が流行している.先生たちは聞くのが好きで、○○から○○までの中で、点数が一番高いのはいくらですか.
これは多くの学生に反感を感じさせて、あなたが喜ぶかどうかにかかわらず、今あなたがしなければならないのは、先生の要求に従って、プログラムを書いて、先生の質問をシミュレートすることです.もちろん、先生はある同級生の成績を更新する必要があることがあります.

入力


この問題には複数のテストが含まれています.ファイルが終わるまで処理してください.各試験の第1行において、2つの正の整数NおよびMは、それぞれ学生の数および操作の数を表す.学生ID番号はそれぞれ1編からNまでです.2行目はN個の整数を含み、このN個の学生の初期成績を表し、i番目の数aiはIDがiの学生の成績を表す.次はM行です.各行には1文字C('Q'または'U'のみ)と2つの正の整数A,Bがある.Cが「Q」である場合、IDがAからB(A,Bを含む)までの学生の中で、成績が最も高いかを尋ねる質問操作であることを示す.Cが「U」の場合、IDがAの学生の成績をBに変更する更新操作であることを示す.

しゅつりょく


対応する問い合わせを出力します.

サンプル入力


5 61 2 3 4 5Q 1 5U 3 6Q 3 4Q 4 5U 2 9Q 1 5

サンプル出力


5659

ヒント


【データの説明】
 
30%のデータに対して、060%のデータに対して、0100%のデータに対して、0分析:DP問題(大神コード参照)
F(N,K)が文字列の前のNビットにK個の乗数を挿入して得られる最大値であると仮定し,F(N,K)とF(N−1,K),F(N−1,K−1)の関係を考慮すると?
添付例:
312:N=3,K=1のとき、N=1,K=0からF(1,0)=3 F(2,0)=31 F(3,1)=max(F(1,0)*12,F(2,0)*2)=max(36,62)=62を導出する
31245:N=5,K=2,F(1,0)からF(1,0)=3 F(2,0)=31 F(3,0)=312 F(2,1)=3*1=3 F(3,1)=max(F(1,0)*12,F(2,0)*2)=max(36,62)=62 F(4,1)=max(F(1,0)*124,F(2,0)*24,   F(3,   0)   *   4)   =   max(372,   744,   1248)   =   1248 F(5,   2)   =   max(F(2,   1)   *   245,   F(3,   1)   *   45,   F(4,   1)   *   5)   =   max(735,   2790,   6240)   =   6240
動的計画方程式:A[I,Num]B[I,Num]を最初の数字からI番目の数字にNum個の乗数を加えた最大値とし、s[k,I]がk番目からI番目の数字を表すとB[I,Num]=max(A[k,Num-1]*S[k+1,I])1+Num-1<=k<=Iとする.    
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
int main()
{
    int n,k;
    char ch[45];
    cin>>n>>k;
    scanf("%s",ch+1);
    int f[45],asum=0;
    for (int i=1;i<=n-k;i++)  // * 
    {
        asum=asum*10+ch[i]-'0';
        f[i]=asum;
    }
    for (int tk=1;tk<=k;tk++)
    {
        for (int tn=n-k+tk;tn>=tk+1;tn--)
        {
            f[tn]=-1;
            char temp[45];
            for (int j=tk;j<=tn-1;j++)       // f[tn] 
            {
                memcpy(temp,ch+j+1,tn-j);
                temp[tn-j]=0;
                if (f[tn] < f[j]*atoi(temp))  f[tn]=f[j]*atoi(temp);   //atoi()   int 
            }
        }
    }
    printf("%d
",f[n]); return 0; }