酒最多是m
为什么?
如果大于m走到最后的花时,酒不为0
,与题意冲突!!!
走到最后的花时,刚好酒用完了为0。
而花最多为m,所以酒最多是m。
f [ i ] [ j ] [ k ] 表示 i 个店, j 个花,酒壶还剩 k 斗酒 f[i][j][k]表示i个店,j个花,酒壶还剩k斗酒 f[i][j][k]表示i个店,j个花,酒壶还剩k斗酒
集合:一共遇到i个店、j朵花,且有k斗酒的所有方案的集合
属性:count
分为两种状态:要么最后是店、要么最后是花。
并且只会属于其中一种情况,划分的集合是不重不漏的。
f[i][j][k]
则前面走了i-1
个店、j
朵花、酒还剩k/2
。
每次走到店,会多2倍,走到最后的店时酒为k
最后一次走到店的k/2*2=k
所以是k/2
(k要能整除2)
方案数: f [ i − 1 ] [ j ] [ k / 2 ] ( i > = 1 , k / 2 ) 方案数:f[i-1][j][k/2] (i>=1,k/2) 方案数:f[i−1][j][k/2](i>=1,k/2)
f[i][j][k]
则前面走了i
个店,j-1
朵花,酒剩余k+1
。
为什么是k+1
?
需要反推一下,最后的状态一定是K
。
每次走到花,会减少1,走到最后的花时酒为k
。
所以是k+1
方案数: f [ i ] [ j − 1 ] [ k + 1 ] ( j > = 1 ) 方案数:f[i][j-1][k+1] (j>=1) 方案数:f[i][j−1][k+1](j>=1)
最后一站是花,走到最后一站前酒还剩1
斗。
所以最后的答案是
f [ n ] [ m − 1 ] [ 1 ] f[n][m-1][1] f[n][m−1][1]
import java.util.*;
public class Main{
static int mods=1000000007;
static int N=110;
static int f[][][]=new int[N][N][N];
public static void main(String []args){
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
int m=sc.nextInt();
f[0][0][2]=1;
for(int i=0;i<=n;i++){
//店数最多为n,i最多为n
for(int j=0;j<=m;j++){
//花数最多为m,j最多为m
for(int k=0;k<=m;k++){
//走到最后的花,酒最多为m。
//最后为店的方案数
if(i>=1&&k%2==0)f[i][j][k]+=f[i-1][j][k/2]%mods;
//最后为花的方案数
if(j>=1)f[i][j][k]+=f[i][j-1][k+1]%mods;
}
}
}
//倒推倒数第二个状态
//最后一站是花,走到最后一站前酒还剩1斗。
System.out.println(f[n][m-1][1]);
}
}
☀️☀️☀️☀️☀️☀️
后续有补充,持续更新中
喜欢的伙伴点点赞,关个注