983. 最低票价
核心思想:对于365天中的一天,如果它不在旅行的日子,我们在这一天可以不花钱;如果它在旅行的日期,那么要么这一天花钱,要么在前面花钱的时间范围内。所以想到了动态规划,对于dp[x]表示第x天到最后一天的最低消费,如果x不在days中,dp[x] = dp[x+1],如果在days中,那么在dp[x+1]+cost[1],dp[x+7]+cost[7],dp[x+30]+cost[30]中取最小值。
1911. 最大子序列交替和
核心思想:动态规划,其实这题的动态规划不是很好想。
dp[i][0]表示nums[:i]中的长度为奇数的最大交替和为dp[i][0]
dp[i][1]表示nums[:i]中的长度为偶数的最大交替和为dp[i][1]
其实写出dp的含义就很好做了,后面会对状态进行压缩,因为开辟dp数组会出现超内存的情况。
894. 所有可能的真二叉树
核心思想:递归遍历。首先题目分析,对于n个节点的真二叉树,它包含三部分,左子树,右子树和根节点,当左子树的节点为x的时候,右子树的节点个数为y = n-x-1,所以我们可以通过枚举x,y来得到所有可能的真二叉树。因为对于节点个数相同的时候,其得到的答案可能是一样的,所以我们想到用一个mod来存储,节点为1,2,...n的结果。因为要构成真二叉树,x的个数肯定是奇数,如果是偶数肯定不行,所以这里我们x的值,直接就取1,3,。。。而不用去枚举所有的情况的。