https://leetcode-cn.com/problems/build-array-where-you-can-find-the-maximum-exactly-k-comparisons/
这道题我先从枚举dfs,需要使用到已经枚举的个数,之前的最大数、以及花费。
然后稍微改下,所以状态定义是dp[i][max_num][cost],表示已经枚举的个数,已经枚举的最大数、以及花费 的数量。
然后设置dp[0][1][num]=1,
状态转移是从上一个枚举位置转移过来,记数dp,记录每个状态有多少个个数,那么一个状态的个数由能转移到这个状态的个数相加之和。
class Solution {
public:
int numOfArrays(int n, int m, int k) {
int mod=1000000007;
long long dp[50+5][100+5][100+5];
memset(dp,0,sizeof(dp));
for(int i=1;i<=m;i++)
dp[0][1][i]=1;
for(int i=1;i<n;i++){
for(int count=1;count<=k;count++){
for(int num2=1;num2<=m;num2++){
for(int num1=1;num1<=m;num1++){
if(num2<=num1){
dp[i][count][num1]+=dp[i-1][count][num1];
dp[i][count][num1]%=mod;
}
else if(num2>num1){
dp[i][count+1][num2]+=dp[i-1][count][num1];
dp[i][count+1][num2]%=mod;
}
}
}
}
}
long long ans=0;
for(int i=1;i<=m;i++){
ans+=dp[n-1][k][i];
ans%=mod;
}
return ans;
}
};