ZCMU — 1994

1994:サルに餌をやる

時間制限:  2秒   メモリ制限:  128 MB
送信:  7   解決:  4
[ 送信 ] [ ステータス ] [ Webボード ]

説明

アリスはサルを飼っています。彼女は毎日果物をサルに与えなければなりません。彼女は、バナナ、桃、リンゴの3種類の果物を持っています。毎日、彼女は3人に1人を選び、そのうちの1つを選んでサルに餌を与えます。しかし、サルはうるさいです。D1連続日以上のバナナ、D2連続日以上の桃、またはD3連続日以上のリンゴは必要ありません。現在、アリスはN1バナナ、N2桃、N3リンゴを持っています。サルに給餌するための計画の数を計算するのを手伝ってください。

入力

複数のテストケース。1行目には、テストケースの数を示す整数T(T <= 20)が含まれています。
各テストケースは、6つの整数N1、N2、N3、D1、D2、D3(N1、N2、N3、D1、D2、D3 <= 50)を含む行です。

出力

ケースごとに1行。(N1 + N2 + N3)日間にサルに給餌する計画の数。
答えが大きすぎるため、1000000007を変更する必要があります。

入力例

1
2 1 1 1 1 1

出力例

6

ヒント


回答
は、BPBA、BPAB、BABP、BABP、PBAB、およびABPBです。 



(B-バナナ
P-ピーチA-アップル) 

【分析】

難しいdpではありません...国境はあまりにも怠惰で考えられません...ただ覚えて、直接検索してください

現在のf [a] [b] [c] [last] [now]ステータスについて、残りのa aフルーツ、b bフルーツ、c cフルーツ、最後の1つが最後のフルーツを記録し、今すぐ連続して選択

ステータスは非常に単純です...現在の状況に合わせて別の果物を選択してください...つまり、dp次元が高くなり、コードが長くなります...

その後、MODは0を書き込み、WAが送信されます...それは本当に不快です

【コード】

#include<bits/stdc++.h>
using namespace std;
#define MOD 1000000007
int N1,N2,N3,D1,D2,D3;
int f[51][51][51][4][51];
 
int dfs(int a,int b,int c,int last,int now)
{ 
    if (a<0 || b<0 || c<0 || (last == 1 && now >D1) || (last == 2 && now>D2) || (last == 3 && now >D3) ) return 0;
    if (a==0 && b==0 && c==0) return 1;
    if (f[a][b][c][last][now]!=-1) return f[a][b][c][last][now];
    if (last == 1)
    {
        return f[a][b][c][last][now] = ((dfs(a-1,b,c,1,now+1) + dfs(a,b-1,c,2,1))%MOD +
                                        dfs(a,b,c-1,3,1)
                                        ) % MOD;
    }else
    if (last == 2)
    {
        return f[a][b][c][last][now] = ((dfs(a-1,b,c,1,1) + dfs(a,b-1,c,2,now+1))%MOD +
                                        dfs(a,b,c-1,3,1)
                                        ) % MOD;
    }else
    if (last == 3)
    {
        return f[a][b][c][last][now] = ((dfs(a-1,b,c,1,1) + dfs(a,b-1,c,2,1))%MOD +
                                        dfs(a,b,c-1,3,now+1)
                                        ) % MOD;
    }
}
 
int main()
{
    int pp;scanf("%d",&pp);
    while (pp--)
    {
        memset(f,-1,sizeof(f));
        scanf("%d%d%d%d%d%d",&N1,&N2,&N3,&D1,&D2,&D3);  
        int ans = ((dfs(N1-1,N2,N3,1,1) + dfs(N1,N2-1,N3,2,1))%MOD + dfs(N1,N2,N3-1,3,1)) % MOD;
        printf("%d\n",ans);
    }   
    return 0;
}

おすすめ

転載: blog.csdn.net/jnxxhzz/article/details/80425216
おすすめ