leetcode 53 最大子序列之和(动态规划)
思路:nums为给定的数组,动态规划:
设 一维数组:dp[i] 表示 以第i个元素为结尾的一段最大子序和。
1)若dp[i-1]小于0,则dp[i]加上前面的任意长度的序列和都会小于nums[i],则 dp[i] = nums[i];
2) 若dp[i-1] 不小于0, 则 dp[i] = dp[i-1] + nums[i];
边界条件:dp[0] = nums[0] (nums数组的第一个元素的最大长度就是本身)
class Solution {
public:
int maxSubArray(vector<int>& nums) {
int len = nums.size();
if(len == ) return ;
if(len == ) return nums[];
vector<int> dp(len, ); //dp[i]: 以第i个元素为结尾的最大子序列和
dp[] = nums[];
int max_num = dp[];
for(int i=; i<len; i++){
if(dp[i-] > )
dp[i] = dp[i-] +nums[i];
else
dp[i] = nums[i];
max_num = max(max_num, dp[i]);
}
return max_num;
}
};
最长公共子序列:
https://www.nowcoder.com/courses/6/8/3
#include<bits/stdc++.h>
using namespace std;
int longestsub(string a, string b){
int a_s = a.size(), b_s = b.size();
int N = (a_s >= b_s)? a_s: b_s;
int dp[N+][N+];
memset(dp, , sizeof(dp));
if(a_s<= || b_s<=)
return ;
for(int i=; i<=a_s; i++){
for(int j=; j<=b_s; j++){
if(a[i-]==b[j-])
dp[i][j] = dp[i-][j-]+;
else
dp[i][j] = max(dp[i-][j], dp[i][j-]);
//cout<<dp[i][j]<<" ";
}
//cout<<endl;
}
return dp[a_s][b_s];
}
int main(){
string a, b;
while(cin>>a>>b){
int res = longestsub(a,b);
cout<<res<<endl;
}
return ;
}
568 Maximum Vacation Days 最大化休假日
LeetCode wants to give one of its best employees the option to travel among N cities to collect algorithm problems. But all work and no play makes Jack a dull boy, you could take vacations in some particular cities and weeks. Your job is to schedule the traveling to maximize the number of vacation days you could take, but there are certain rules and restrictions you need to follow.
Rules and restrictions:
- You can only travel among N cities, represented by indexes from 0 to N-1. Initially, you are in the city indexed 0 on Monday.
- The cities are connected by flights. The flights are represented as a N*N matrix (not necessary symmetrical), called flights representing the airline status from the city i to the city j. If there is no flight from the city i to the city j, flights[i][j] = 0; Otherwise, flights[i][j] = 1. Also, flights[i][i] = 0 for all i.
- You totally have K weeks (each week has 7 days) to travel. You can only take flights at most once per day and can only take flights on each week's Monday morning. Since flight time is so short, we don't consider the impact of flight time.
- For each city, you can only have restricted vacation days in different weeks, given an N*K matrix called days representing this relationship. For the value of days[i][j], it represents the maximum days you could take vacation in the city i in the week j.
You're given the flights matrix and days matrix, and you need to output the maximum vacation days you could take during K weeks.
Example 1:
Input:flights = [[0,1,1],[1,0,1],[1,1,0]], days = [[1,3,1],[6,0,3],[3,3,3]]
Output: 12
Explanation:
Ans = 6 + 3 + 3 = 12.
One of the best strategies is:
1st week : fly from city 0 to city 1 on Monday, and play 6 days and work 1 day.
(Although you start at city 0, we could also fly to and start at other cities since it is Monday.)
2nd week : fly from city 1 to city 2 on Monday, and play 3 days and work 4 days.
3rd week : stay at city 2, and play 3 days and work 4 days.
Example 2:
Input:flights = [[0,0,0],[0,0,0],[0,0,0]], days = [[1,1,1],[7,7,7],[7,7,7]]
Output: 3
Explanation:
Ans = 1 + 1 + 1 = 3.
Since there is no flights enable you to move to another city, you have to stay at city 0 for the whole 3 weeks.
For each week, you only have one day to play and six days to work.
So the maximum number of vacation days is 3.
Example 3:
Input:flights = [[0,1,1],[1,0,1],[1,1,0]], days = [[7,0,0],[0,7,0],[0,0,7]]
Output: 21
Explanation:
Ans = 7 + 7 + 7 = 21
One of the best strategies is:
1st week : stay at city 0, and play 7 days.
2nd week : fly from city 0 to city 1 on Monday, and play 7 days.
3rd week : fly from city 1 to city 2 on Monday, and play 7 days.
Note:
- N and K are positive integers, which are in the range of [1, 100].
- In the matrix flights, all the values are integers in the range of [0, 1].
- In the matrix days, all the values are integers in the range [0, 7].
- You could stay at a city beyond the number of vacation days, but you should work on the extra days, which won't be counted as vacation days.
- If you fly from the city A to the city B and take the vacation on that day, the deduction towards vacation days will count towards the vacation days of city B in that week.
- We don't consider the impact of flight hours towards the calculation of vacation days.
题目大意:
- N和K是正整数,范围[1, 100]
- 矩阵flights的元素范围[0, 1]
- 矩阵days的元素范围[0, 7]
思路:
解题思路:
dp[w][c]表示第w周选择留在第c个城市可以获得的最大总收益 初始令dp[w][0] = 0, dp[w][1 .. c - 1] = -1 当dp[w][c] < 0时,表示第c个城市在第w周时还不可达。
for w in ( .. K)
for sc in ( .. N)
if dp[w][sc] < :
continue
for tc in ( .. N)
if sc == tc or flights[sc][tc] == :
dp[w + ][tc] = max(dp[w + ][tc], dp[w][sc] + days[tc][w])
class Solution {
public:
int maxVacationDays(vector<vector<int>>& flights, vector<vector<int>>& days) {
int N = flights.size();
int K = days[].size(); vector<vector<int>> dp(K, vector<int>(N, ));
vector<vector<bool>> reach(K, vector<bool>(N, false)); // first week, no guesses for the previous city
for (int city = ; city < N; ++city)
if (city == || flights[][city]) {
dp[][city] = days[city][]; //第0周留在city可获得的最大收益==在city逗留的最大天数
reach[][city] = true; //第0周可达city
} // topological order (week)
for (int week = ; week < K; ++week) {
// current city
for (int city = ; city < N; ++city) {
// Subproblem: guess a previous city
for (int prevCity = ; prevCity < N; ++prevCity) {
if (reach[week - ][prevCity] && (city == prevCity || flights[prevCity][city])) {
dp[week][city] = max(dp[week][city], dp[week - ][prevCity] + days[city][week]);
reach[week][city] = true;
}
}
}
} int res = ;
for (int city = ; city < N; ++city)
res = max(res, dp[K - ][city]); return res; } };
leetcode 53 最大子序列之和(动态规划)的更多相关文章
- 小旭讲解 LeetCode 53. Maximum Subarray 动态规划 分治策略
原题 Given an integer array nums, find the contiguous subarray (containing at least one number) which ...
- [array] leetcode - 53. Maximum Subarray - Easy
leetcode - 53. Maximum Subarray - Easy descrition Find the contiguous subarray within an array (cont ...
- hdu1003 Max Sum【最大连续子序列之和】
题目链接:https://vjudge.net/problem/HDU-1003 题目大意:给出一段序列,求出最大连续子序列之和,以及给出这段子序列的起点和终点. 解题思路:最长连续子序列之和问题其实 ...
- [LeetCode] 4Sum 四数之和
Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = tar ...
- leetcode:House Robber(动态规划dp1)
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- CJOJ 2044 【一本通】最长公共子序列(动态规划)
CJOJ 2044 [一本通]最长公共子序列(动态规划) Description 一个给定序列的子序列是在该序列中删去若干元素后得到的序列.确切地说,若给定序列X,则另一序列Z是X的子序列是指存在一个 ...
- C#版 - Leetcode 633. 平方数之和 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. C#版 - L ...
- 【LOJ#6074】子序列(动态规划)
[LOJ#6074]子序列(动态规划) 题面 LOJ 题解 考虑一个暴力\(dp\). 设\(f[i][c]\)表示当前在第\(i\)位,并且以\(c\)结尾的子序列个数. 那么假设当前位为\(a\) ...
- 【BZOJ2423】最长公共子序列(动态规划)
[BZOJ2423]最长公共子序列(动态规划) 题面 BZOJ 洛谷 题解 今天考试的时候,神仙出题人\(fdf\)把这道题目作为一个二合一出了出来,我除了orz还是只会orz. 对于如何\(O(n^ ...
随机推荐
- p4051 [JSOI2007]字符加密
传送门 分析 将字符串复制一遍然后直接求sa即可 代码 #include<iostream> #include<cstdio> #include<cstring> ...
- Header add Access-Control-Allow-Origin: *
允许所有域名跨域 Header add Access-Control-Allow-Origin: *
- Web测试实践-任务进度-Day02
小组成员 华同学.郭同学.覃同学.刘同学.穆同学.沈同学 任务进度 在经过任务分配阶段后,大家都投入到了各自的任务中,以下是大家今天任务的进度情况汇总. 华同学 & 刘同学(任务1) 1.对爱 ...
- [GO]timer的应用
package main import ( "time" "fmt" ) func main() { //创建一个定时器,设置时间为2s,2s后,往time.C ...
- 团体程序设计天梯赛L1-027 出租 2017-03-23 23:16 40人阅读 评论(0) 收藏
L1-027. 出租 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 下面是新浪微博上曾经很火的一张图: 一时间网上一片求救声, ...
- APUE(8)---进程控制(1)
一.进程标识 每个进程都有一个非负整型标识的唯一进程ID.因为进程ID标识符总是唯一的,常将其用做其他标识符的一部分以保证其唯一性.进程ID虽然是唯一的, 但是却是可以复用的.ID为0的进程通常是调度 ...
- Dubbo RPC源码解读
https://yq.aliyun.com/articles/272405#27 本文代码摘录的时候,将一些与本流程无关的内容去掉了,如有需要请看源码. 一.闲言碎语 使用rpc框架已经多年了,虽然之 ...
- speedbutton用法
- Android-bindService远程服务(Aidl)-初步
之前上一篇讲解到本地服务,本地服务只能在自身APP中Activity访问Service,调用Service里面到方法等操作 如果想A应用访问B应用里面的方法,属于跨进程调用,如果Android不特供这 ...
- Arcgis Android 常见问题
关于arcgis android 安装包较大的问题 如果想缩小大小,可以只保留armeabi,只是这样就不支持x86类型cpu的手机了. 可以考虑做成单独的版本,供用户下载. 即打2个包,一个供普通a ...