class Solution {
public:
int uniquePaths(int m, int n) {
int dp[m][n];
int i,j;
for(i = 0 ; i<m ; ++i ){
dp[i][0] = 1;
}
for(i = 0 ; i < n ; ++i ) {
dp[0][i] = 1;
}
for(i = 1; i < m ; ++i ) {
for( j = 1 ; j < n ; ++j ) {
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
};
这题可以使用动态规划来解决,按照如下几个步骤:设计状态->写出状态转移方程->设定初始状态->执行状态转移->返回结果;
class Solution {
public:
int minCount(vector<int>& coins) {
int ans = 0;
for(int i = 0 ; i < coins.size() ; ++i) {
ans += (coins[i]+1)/2;
}
return ans;
}
};
不论一共有几个都可以直接用个数除以二然后向上取整。
class Solution {
public:
int percentageLetter(string s, char letter) {
int i , len = s.size();
int ans = 0;
for(i = 0 ; i < len ; ++i){
if(s[i] == letter){
ans++;
}
}
return 100*ans/len;
}
};
注意变量要初始化。
class Solution {
public:
vector<bool> prefixesDivBy5(vector<int>& nums) {
vector<bool> ans;
int i = 0;
int sum = 0;
int len = nums.size();
while(i < len) {
sum<<=1;
sum+=nums[i];
sum%=5;
i++;
ans.push_back(!sum);
}
return ans;
}
};
这里有一个小技巧, sum 在判断过程中不断的模除 5 就可以防止 sum 的值过大。
class Solution {
public:
int fib(int n) {
int dp[101] = {0};
dp[1] = 1;
for(int i = 2;i<=n;++i){
dp[i] = (dp[i-1] + dp[i-2])%1000000007;
}
return dp[n];
}
};
这题如果直接使用递归是会超时的,可以使用动态规划来实现。
class Solution {
public:
int fib(int n) {
int dp[31] = {0};
dp[1] = 1;
for(int i = 2;i<=n;++i){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};
同上。
class Solution {
public:
int numWays(int n) {
int dp[101];
dp[0] = 1;
dp[1] = 1;
for(int i = 2;i<=n;++i){
dp[i] = (dp[i-1] + dp[i-2])%1000000007;
}
return dp[n];
}
};
同上,不过需要修改一下初始值。
class Solution {
int dp[46];
public:
int climbStairs(int n) {
dp[0] = 1;
dp[1] = 1;
for(int i = 2 ; i <= n ; ++i){
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
};
同上。
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int dp[1001];
dp[0] = 0;
dp[1] = 0;
int n = cost.size();
for(int i = 2 ; i <= n; ++i){
dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[n];
}
};
这题一定要理清楚初始状态,然后到达当前层数的可能性就只有两种了,要不然就是爬了一格到当前层,要不然就是爬两层到当前层,然后取这两者中最少的就是到达当前楼层的最少花费。是一个最基础的动态规划。
class Solution {
public:
int minCostClimbingStairs(vector<int>& cost) {
int dp[1001];
dp[0] = 0;
dp[1] = 0;
int n = cost.size();
for(int i = 2 ; i <= n; ++i){
dp[i] = min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
}
return dp[n];
}
};
同上。