动态规划-专题
2017-08-06 10:22
363 查看
LCS 最长公共子序列
最长公共子串(连续)
最短编辑距离
模式串匹配
题型四:乘积最大子序列
0-1背包:(就地滚动和01滚动)
网易2017实习生笔试题:
一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。
[b]输入描述:[/b]
[b]输出描述:[/b]
[b]输入例子1:[/b]
[b]输出例子1:[/b]
连续子数组的最大值
class Solution { public: /** * @param A, B: Two strings. * @return: The length of longest common subsequence of A and B. */ int longestCommonSubsequence(string A, string B) { // write your code here int lena=A.length(),lenb=B.length(); int dp[lena][lenb]; memset(dp,0,sizeof(dp)); for(int i=0;i<lena;i++) { if(A[i]==B[0]) dp[i][0]=1; } for(int j=0;j<lenb;j++) { if(B[j]==A[0]) dp[0][j]=1; } for(int i=1;i<lena;i++) { for(int j=1;j<lena;j++) { if(A[i]==B[j]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } return dp[lena-1][lenb-1]; } };
最长公共子串(连续)
int longestCommonSubsequence(string A, string B) { int lena=A.length(),lenb=B.length(); int dp[lena][lenb]; int ret=0; for(int i=0;i<lena;i++) { if(A[i]==B[0]) { dp[i][0]=1; ret=1; } } for(int i=0;i<lenb;i++) { if(A[0]==B[i]) { dp[0][i]=1; ret=1; } } for(int i=1;i<lena;i++) { for(int j=1;j<lenb;j++) { if(A[i]==B[j]) { dp[i][j]=dp[i-1][j-1]+1; ret=max(ret,dp[i][j]); } else dp[i][j]=0; } } return ret; }
最短编辑距离
int minDistance(string word1, string word2) { // write your code here int lena=word1.length(),lenb=word2.length(); int dp[lena+1][lenb+1]; for(int i=0;i<=lena;i++) dp[i][0]=i; for(int i=0;i<=lenb;i++) dp[0][i]=i; for(int i=1;i<=lena;i++) { for(int j=1;j<=lenb;j++) { int del=dp[i-1][j]+1; int ins=dp[i][j-1]+1; int chan=dp[i-1][j-1]+(word1[i-1]==word2[j-1]?0:1); dp[i][j]=min(min(del,ins),chan); } } return dp[lena][lenb]; }
模式串匹配
'?' Matches any single character. '*' Matches any sequence of characters (including the empty sequence).
bool isMatch(string s, string p) { int lena=s.length(),lenb=p.length(); bool dp[lena+1][lenb+1]; memset(dp,false,sizeof(dp)); dp[0][0]=true; for(int i=1;i<=lenb;i++) { if(dp[0][i-1]==true&&p[i-1]=='*') dp[0][i]=true; } for(int i=1;i<=lena;i++) { for(int j=1;j<=lenb;j++) { if(p[j-1]=='*') dp[i][j]=dp[i-1][j-1]||dp[i][j-1]||dp[i-1][j]; else if(p[j-1]=='?') dp[i][j]=dp[i-1][j-1]; else dp[i][j]=(s[i-1]==p[j-1]?dp[i-1][j-1]:false); } } return dp[lena][lenb]; }
题型四:乘积最大子序列
int maxProduct(vector<int>& nums) { // write your code here if(nums.size()==0) return 0; if(nums.size()==1) return nums[0]; int ret=nums[0],minn=nums[0],maxn=nums[0]; for(int i=1;i<nums.size();i++) { if(nums[i]<0) { int tmpminn=min(nums[i],maxn*nums[i]); int tmpmaxn=max(nums[i],minn*nums[i]); minn=tmpminn; maxn=tmpmaxn; } else { int tmpminn=min(nums[i],minn*nums[i]); int tmpmaxn=max(nums[i],maxn*nums[i]); minn=tmpminn; maxn=tmpmaxn; } ret=max(ret,maxn); } return ret; }
0-1背包:(就地滚动和01滚动)
网易2017实习生笔试题:
一种双核CPU的两个核能够同时的处理任务,现在有n个已知数据量的任务需要交给CPU处理,假设已知CPU的每个核1秒可以处理1kb,每个核同时只能处理一项任务。n个任务可以按照任意顺序放入CPU进行处理,现在需要设计一个方案让CPU处理完这批任务所需的时间最少,求这个最小的时间。
[b]输入描述:[/b]
输入包括两行: 第一行为整数n(1 ≤ n ≤ 50) 第二行为n个整数length[i](1024 ≤ length[i] ≤ 4194304),表示每个任务的长度为length[i]kb,每个数均为1024的倍数。
[b]输出描述:[/b]
输出一个整数,表示最少需要处理的时间
[b]输入例子1:[/b]
5 3072 3072 7168 3072 1024
[b]输出例子1:[/b]
9216
#include<iostream>
#include<vector>
#include<math.h>
#include<queue>
#include<map>
#include<string>
#include<sstream>
#include <string.h>
using namespace std;
int main() {
int n;
cin>>n;
vector<int> nums;
nums.resize(n);
int sum=0;
for(int i=0;i<n;i++)
{
cin>>nums[i];
nums[i]/=1024;
sum+=nums[i];
}
bool dp[sum/2+1];
memset(dp,false, sizeof(dp));
dp[0]=true;
int ret=0;
for(int i=0;i<n;i++)
{
for(int j=sum/2;j>=nums[i];j--)
{
//cout<<j<<" "<<nums[i]<<endl;
if(dp[j-nums[i]])
{
dp[j]=true;
ret=max(ret,j);
}
}
}
cout<<(sum-ret)*1024<<endl;
return 0;
}
/*
5 3072 3072 7168 3072 1024
*/
#include<iostream>
#include<vector>
#include<math.h>
#include<queue>
#include<map>
#include<string>
#include<sstream>
#include <string.h>
using namespace std;
int main() {
int n;
cin>>n;
vector<int> nums;
nums.resize(n);
int sum=0;
for(int i=0;i<n;i++)
{
cin>>nums[i];
nums[i]/=1024;
sum+=nums[i];
}
bool dp[2][sum/2+1];
memset(dp,false, sizeof(dp));
dp[0][0]=true;
for(int i=1;i<=n;i++)
{
for(int j=0;j<=sum/2;j++)
{
if(dp[(i-1)&1][j])
{
dp[i&1][j]=true;
if((j+nums[i-1])<=sum/2)
dp[i&1][j+nums[i-1]]=true;
}
}
}
int ret=0;
for(int i=sum/2;i>=0;i--)
{
if(dp[n&1][i])
{
ret=i;
break;
}
}
cout<<(sum-ret)*1024<<endl;
return 0;
}
/*
5 3072 3072 7168 3072 1024
*/
连续子数组的最大值
int maxSubArray(vector<int>& nums) { if(nums.size()==0) return 0; int pre=nums[0],ret=nums[0]; for(int i=1;i<nums.size();i++) { if(pre>0) { pre+=nums[i]; } else { pre=nums[i]; } ret=max(ret,pre); } return ret; }
相关文章推荐
- 动态规划专题:POJ 动态规划题目列表
- 动态规划之数位DP专题
- jzoj P1029【NOIP动态规划专题】电子眼
- 线性动态规划——专题
- 2540. 【NOIP动态规划专题】采药2 (Standard IO)
- JZOJ8.11(C组)【NOIP动态规划专题】采药2 (Standard IO)
- 2014 UESTC暑前集训动态规划专题解题报告
- 南阳理工学院动态规划专题 括号问题2 总结
- 动态规划专题总结
- 动态规划专题:算法合集之《基于连通性状态压缩动态规划问题》
- 动态规划专题
- 动态规划专题训练:(全部是紫书上的题——做到吐)
- 动态规划专题之---- Unique Binary Search Trees
- 南阳理工学院动态规划专题 括号问题2 总结
- 动态规划专题
- 动态规划专题总结!
- 动态规划专题讲义之最大连续子序列之和
- 动态规划总专题
- 动态规划专题——1 矩阵取数
- 合并类动态规划专题训练