- leetcode-LCP 07. 传递信息
题型:动态规划
难度:简单
题目:小朋友 A 在和 ta 的小伙伴们玩传信息游戏,游戏规则如下:有 n 名玩家,所有玩家编号分别为 0 ~ n-1,其中小朋友 A 的编号为 0,每个玩家都有固定的若干个可传信息的其他玩家(也可能没有)。传信息的关系是单向的(比如 A 可以向 B 传信息,但 B 不能向 A 传信息)。每轮信息必须需要传递给另一个人,且信息可重复经过同一个人给定总玩家数 n,以及按 [玩家编号,对应可传递玩家编号] 关系组成的二维数组 relation。返回信息从小 A (编号 0 ) 经过 k 轮传递到编号为 n-1 的小伙伴处的方案数;若不能到达,返回 0。
代码:
class Solution {
public:
//本题用动态规划去做,dp[i][j],i为轮数,j为目的地。
//relation数组中,每个字数组有两个元素,relation[1]是终点,那么relation[1]就是终点的前一个。所以每个终点都依赖于前一个点。
//列出动态方程: dp[k][ralation[j][1]] = dp[k-1][ralation[j-1][0]];j,1是终点,前一个是j,0。求总数,就是这个终点的所有前一个,加在一起。
int numWays(int n, vector<vector<int>>& relation, int k) {
//2 <= n <= 10 1 <= k <= 5
int nlen = n;
int dp[k+1][nlen];
memset(dp,0,sizeof(dp));
//如果轮数为0,数组为0,方案一定为1
dp[0][0] = 1;
for(int i=1;i<=k;i++)
{
for(int j=0;j<relation.size();j++)
{
dp[i][relation[j][1]] += dp[i-1][relation[j][0]];
}
}
return dp[k][nlen-1];
}
};
借鉴:https://leetcode-cn.com/problems/chuan-di-xin-xi/solution/chuan-di-xin-xi-by-leetcode-solution/
- leetcode-39组合总和
题型:回溯
难度:中等
题目:给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的数字可以无限制重复被选取。
说明:
所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
代码:
class Solution {
private:
vector<int> tempvec;
public:
//回溯思想:不合适就退回到下一步
//递归,记录每次的起始下标,依次遍历。只要满足条件就加入数组,并且处理下一个;
//递归结束条件:如果等于0,加入到大数组中;
void huisu(vector<int>& candidates, vector<vector<int> > &vec,int target,int cur,int begin){
if(cur == target)
{
vec.push_back(tempvec);
return;
}
else
{
for(int i=begin;i<candidates.size();i++)
{
if(cur+candidates[i] <= target)
{
//将当前元素放入小数组
tempvec.push_back(candidates[i]);
//继续放相同的元素,因为可以重复
huisu(candidates,vec,target,cur+candidates[i],i);
//如果代码走到这里,不是大于就是等于,等于一定也处理过,把新装节点删除
tempvec.pop_back();
}
}
}
}
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int> > vec;
huisu(candidates,vec,target,0,0);
return vec;
}
};