57. 爬楼梯(第八期模拟笔试)
#include <iostream>
#include <stdio.h>
#include <vector>
using namespace std;
int pa(int n, int m)
{
vector<int> dp(n+1);
dp[0] = 1;
for (int i=1; i<n+1; i++)
for (int j=1; j<=m; j++)
{
if (i-j>=0) dp[i] = dp[i] + dp[i-j];
}
return dp[n];
}
int main()
{
vector<int> arr(2);
for (int i=0; i<2; i++)
{
cin >> arr[i];
}
cout << pa(arr[0], arr[1]) << endl;
}
class Solution {
public:
int coinChange(vector<int>& coins, int amount)
{
if (amount==0) return 0;
vector<int> dp(amount+1, 0);
for (int i=0; i<coins.size(); i++)
for (int j=coins[i]; j<=amount; j++)
{
if (j-coins[i]>=0 && (dp[j-coins[i]] != 0 || j-coins[i]==0))
{
if (dp[j] != 0)
dp[j] = min(dp[j], dp[j-coins[i]]+1);
else dp[j] = dp[j-coins[i]]+1;
}
}
return dp[amount]>0 ? dp[amount] : -1;
}
};
class Solution {
public:
bool is(int n)
{
for (int i=1 ;i<=n; i++)
{
if (i*i==n) return true;
}
return false;
}
int numSquares(int n)
{
if (is(n)) return 1;
vector<int> dp(n+1, 0);
unordered_set<int> memo;
for (int i=1; i<n; i++)
{
if (is(i)) memo.insert(i);
}
vector<int> nums(memo.begin(), memo.end());
for (int i=1; i<=n; i++)
for (int j=0; j<nums.size(); j++)
{
if (i-nums[j]>=0 && (dp[i-nums[j]]!=0 || i-nums[j] ==0))
{
if (dp[i] != 0)
dp[i] = min(dp[i], dp[i-nums[j]]+1);
else dp[i] = dp[i-nums[j]]+1;
}
}
return dp[n];
}
};