两种形状的瓷砖(一种是12的,另一种是12+11的形状),拼2N面积,有多少种拼法(旋转图形算两种不同的,不算成同一种。)
翻译过来也即:
例如本题最后第N列是满的,所以i=N的时候对应状态3。
dp[0][3]=1;
for(int i = 1;i <= n; i++)
{
dp[i][0] = dp[i-1][3];
dp[i][1] = (dp[i-1][0]+dp[i-1][2]);
dp[i][2] = (dp[i-1][0]+dp[i-1][1]);
dp[i][3] = (dp[i-1][0]+dp[i-1][1]+dp[i-1][2]+dp[i-1][3]);
}
return dp[n][3];
二层vector的定义:
vector>(4);
vector>vec;
最后每个元素值都是int类型(本题由于最后的值会很大,故使用long long: vector>
)vector>vec(5);
此处表明:外层是5个元素,也即: [[],[],[],[],[]],最后每个元素值都是int类型vector>vec(5,vector(4));
此处表明:外层是5个元素,内层是4个元素,且是vector
类型。此处为了同时定义内外层元素个数,采用了这种形式: vector>dp(n+1,vector(4));
(虽然不是很理解,但是也会用了)vector大部分情况下会把值初始化为0:
vector>dp(n+1,vector(4));
这一句实际上已经把所有元素初始化成0了题目说返回对 10^9 + 7 取模 的值,但是标答在转移方程中就取模了。所有的转移都是采用的加法,所以在中间步骤取模也没事。
class Solution {
public:
int numTilings(int n)
{
long long mod = 1e9 + 7;
vector<vector<long long>>dp(n+1,vector<long long>(4));
dp[0][3]=1;
for(int i = 1;i <= n; i++)
{
dp[i][0] = dp[i-1][3];
dp[i][1] = (dp[i-1][0]+dp[i-1][2])%mod;
dp[i][2] = (dp[i-1][0]+dp[i-1][1])%mod;
dp[i][3] = (dp[i-1][0]+dp[i-1][1]+dp[i-1][2]+dp[i-1][3]) % mod;
}
return dp[n][3];
}
这一题掺杂了个人的很多不恰当的理解orz