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)を含む行です。
各テストケースは、6つの整数N1、N2、N3、D1、D2、D3(N1、N2、N3、D1、D2、D3 <= 50)を含む行です。
出力
ケースごとに1行。(N1 + N2 + N3)日間にサルに給餌する計画の数。
答えが大きすぎるため、1000000007を変更する必要があります。
答えが大きすぎるため、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;
}