Проблема: сокровище карты много (DP & Card Chang)

титульный

портал

мышление

Этот вопрос является основным предметом плохого состояния нужды и не очень хорошо понимал,

Если вы и я не имели никаких контактов с тем же маджонгом

Сначала мы выполнили всю обработку маджонг хэш

Определено \ (dp_ {I, J, K, L, M, N} \) фронта I - карты, количество записи на пленку и сталкиваются в общей сложности у, количество птиц имеет к, из \ (I-2 \) видов количество карт л, из \ (я-1 \) количество типов карт является м, количество видов карт является н я

Отметим, что значение DP не я-2 ~ я в расчет три карты

Вы можете написать перевод

\ (\ {Начинаются случаи} dp_ {I, J + 1, K, L + 1, т + 1, N + 1} (\ Mbox { прямой}) \\ dp_ {I, J + 1, K, L , м, п + 3} (панг) \\ dp_ {I, J + 1, K, L, M, N + 4} ( первый бар) \\ dp_ {I, J, K + 1, л, м , п + 2} (птицы) \ случаи} {Конец \) = \ (dp_ {I, J, K, L, M, N} \)

Прямая передача место, потому что мы \ (дп \) не считается я-2 ~ я вроде шахмат

В другом случае

\ (Dp_ {+ 1, J, K, M, N, 0} = dp_ {I, J, K, M, N, L} * C_ {T_ {я}} ^ л * qkpow (bp_i, л) \)

В котором \ (t_i \) представляет собой оставшееся количество я-шахматы, \ (bp_i = \ случаях начинают {2} [Ро I-й номер карты] \\ 1 [I-е-карта не] \ конец {случаи} \)

Когда значение этого уравнения не будет рассматривать я в шахматы, то ток \ (дп \) передача состояния обратно, также очень хорошее понимание

Не забудьте добавить статистику последнего вклада статистики, когда три последних шахмат

Тогда говорят об оптимизации

Текущее состояние 0 может пропустить

Доказательство: Последнее состояние должно быть продуктом формулы, в которой, когда а равно 0, 0 непосредственно вся

Не может рассматриваться толстой палкой

Доказательство: \ (^ 3 = 4 C_4 и C_4 ^ 4 = 1 \) означает , что даже если эта карта является сокровищем карта не стоит

Но это вовсе не означает, что условие будет цикл, мы просто продолжаем больше, чем несколько государства

На самом деле уровень постоянная уменьшается

Но вы можете сделать 50 очков вертолет из 100 пунктов

Этот вопрос действительно хорошая дорога (рак) название

Важность постоянного взгляда

код

#pragma GCC optimize(2)
#include<iostream>
#include<cstring>
#include<climits>
#include<queue>
using namespace std;
int T;
priority_queue<int> q;
long long ans;
long long tmp;
int num_pow[3][5];
long long dp[35][5][2][5][5][5];
int sz[35]={0,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,1,1,1,1,1,1,1,0,0,0,0,0,0,0};
int gs[14]={0,1,9,10,18,19,27,28,29,30,31,32,33,34};
int t[35];
int bp[35];
int c[5][5]=
{
{1,0,0,0,0},
{1,1,0,0,0},
{1,2,1,0,0},
{1,3,3,1,0},
{1,4,6,4,1}
};
string a;
int solve_hash(string a)
{
    if(a[1]=='m')
        return a[0]-'0';
    if(a[1]=='p')
        return a[0]-'0'+9;
    if(a[1]=='s')
        return a[0]-'0'+18;
    if(a[0]=='E')
        return 28;
    if(a[0]=='S')
        return 29;
    if(a[0]=='W')
        return 30;
    if(a[0]=='N')
        return 31;
    if(a[0]=='Z')
        return 32;
    if(a[0]=='B')
        return 33;
    if(a[0]=='F')
        return 34;
}
void init()
{
    while(!q.empty())
        q.pop();
    memset(dp,0,sizeof(dp));
    dp[1][0][0][0][0][0]=1;
    ans=0;
    for(int i=1;i<=34;i++)
    {
        bp[i]=1;
        t[i]=4;
    }
}
int qkpow(int a,int b)
{
    if(num_pow[a][b])
        return num_pow[a][b];
    if(b==0)
        return 1;
    if(b==1)
        return a;
    long long t=qkpow(a,b/2);
    t=(t*t);
    if(b%2==1)
        t*=a;
    num_pow[a][b]=t;
    return t;
}
void c_in()
{
    init();
    while(1)
    {
        cin>>a;
        if(a[0]=='0')
            break;
        t[solve_hash(a)]--;
    }
    while(1)
    {
        cin>>a;
        if(a[0]=='0')
            break;
        bp[solve_hash(a)]=2;
    }
    for(int i=1;i<=13;i++)
    {
        tmp=1;
        for(int j=1;j<=13;j++)
        {
            if(i==j)
            {
                if(t[gs[i]]<2)
                    tmp=0;
                else
                    tmp=tmp*c[t[gs[i]]][2]*qkpow(bp[gs[i]],2);
            }
            else
            {
                if(!t[gs[j]])
                    tmp=0;
                else
                    tmp=tmp*c[t[gs[j]]][1]*qkpow(bp[gs[j]],1);
            }
        }
        ans=max(ans,tmp*13);
    }
    for(int i=1;i<=34;i++)
        if(t[i]>=2)
            q.push(c[t[i]][2]*qkpow(bp[i],2));
    if(q.size()>=7)
    {
        tmp=1;
        for(int i=1;i<=7;i++)
        {
            tmp=tmp*q.top();
            q.pop();
        }
        ans=max(ans,tmp*7);
    }
    for(int i=1;i<=34;i++)
    {
        for(int j=0;j<=4;j++)
        {
            for(int k=0;k<=1;k++)
            {
                for(int l=0;l<=4;l++)
                {
                    for(int m=0;m<=4;m++)
                    {
                        for(int n=0;n<=4;n++)
                        {
                            long long now=dp[i][j][k][l][m][n];
                            if(!now)
                                continue;   
                            if(k==0&&t[i]-n>=2)
                                dp[i][j][k+1][l][m][n+2]=max(dp[i][j][k+1][l][m][n+2],now);
                            if(t[i]-n>=3&&j<4)
                                dp[i][j+1][k][l][m][n+3]=max(dp[i][j+1][k][l][m][n+3],now);
                            if(sz[i]&&t[i-2]-l>=1&&t[i-1]-m>=1&&t[i]-n>=1&&j<4)
                                dp[i][j+1][k][l+1][m+1][n+1]=max(dp[i][j+1][k][l+1][m+1][n+1],now);
                            if(i<34)
                                dp[i+1][j][k][m][n][0]=max(dp[i+1][j][k][m][n][0],now*(i>2?c[t[i-2]][l]:1)*qkpow(i>2?bp[i-2]:1,l));
                            if(i==34&&j==4&&k==1)
                                ans=max(ans,now*c[t[i-2]][l]*qkpow(bp[i-2],l)*c[t[i-1]][m]*qkpow(bp[i-1],m)*c[t[i]][n]*qkpow(bp[i],n));
                        }
                    }
                }
            }
        }
    }
    cout<<ans<<'\n';
}
int main()
{ 
    ios::sync_with_stdio(false);
    cin>>T;
    for(int i=1;i<=T;i++)
        c_in();
    return 0;
}

Да, это шестимерная

рекомендация

отwww.cnblogs.com/loney-s/p/12041057.html