749. 约翰的后花园
约翰想在他家后面的空地上建一个后花园,现在有两种砖,一种3
dm的高度,7
dm的高度。约翰想围成x
dm的墙。如果约翰能做到,输出YES,否则输出NO;
解:该题目主要是类似0-1背包问题,公式f(x) = f(x-3) || f(x-7)
非递归版本如下,主要是浪费空间复杂度换取时间复杂度。
class Solution {public:
/**
* @param x: the wall's height
* @return: YES or NO
*/
string isBuild(int x) {
if( x < 3 ){
return "NO";
}
int temp[1001] = { 0 };
temp[0] = 1;
for(int i = 3 ; i <= x ; i++){
if(temp[i-3] == 1){
temp[i] = 1; //这里用到动态规划,思路是通过后往前退,计算由前往后
}
}
for(int i = 7; i <= x; i++){
/* code */
if(temp[i-7] == 1){
temp[i] = 1; //这里就是用到动态规划
}
}
if(temp[x] == 1){
return "YES";
}
else{
return "NO";
}
}
};
递归版本如下,主要是通过迭代进行。
bool isBuild_temp(int x ){
if( x < 0){
return false;
}
if(x == 3){
return true;
}
if(x == 7){
return true;
}
if(x < 3){
return false;
}
return isBuild_temp(x-3) || isBuild_temp(x-7);
}
string isBuild(int x) {
// write you code here
return isBuild_temp(x) ? "YES" : "NO";
}