1045. Favorite Color Stripe (30)
2015-11-20 20:32
113 查看
1.这个和最长公共子序列问题相类似(LCS)
2.不同的地方是允许元素重复,如{a}和{aaa},匹配出来的是3,a可以重复3次
3.该问题一开始卡在了输入格式上
4.动态规划方程:dp[i][j]表示f[0~i]与o[0~j]匹配的最大长度
如果f[i]==o[j],dp[i][j]=max(dp[i][j-1]+1,dp[i-1][j-1]),当目前颜色相同,在上一个的基础上+1(表示上一次已经使用f[i]进行匹配),或者在dp[i-1][j-1]上+1(表示这次才开始使用f[i]作为匹配);
如果f[i]!=o[j],dp[i][j]=max(dp[i][j-1],dp[i-1][j]),当目前的颜色不相同,那么选取dp[i][j-1](f[i]已经进行匹配)和dp[i-1][j](f[i]未进行匹配)的最大值。
5.还有一种最简单的方法:dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]),如果f[i]==o[j],则dp[i][j]++:(采用了LCS的思想)
简单方法的AC代码:
第一种方法AC代码:
2.不同的地方是允许元素重复,如{a}和{aaa},匹配出来的是3,a可以重复3次
3.该问题一开始卡在了输入格式上
4.动态规划方程:dp[i][j]表示f[0~i]与o[0~j]匹配的最大长度
如果f[i]==o[j],dp[i][j]=max(dp[i][j-1]+1,dp[i-1][j-1]),当目前颜色相同,在上一个的基础上+1(表示上一次已经使用f[i]进行匹配),或者在dp[i-1][j-1]上+1(表示这次才开始使用f[i]作为匹配);
如果f[i]!=o[j],dp[i][j]=max(dp[i][j-1],dp[i-1][j]),当目前的颜色不相同,那么选取dp[i][j-1](f[i]已经进行匹配)和dp[i-1][j](f[i]未进行匹配)的最大值。
5.还有一种最简单的方法:dp[i][j]=max(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]),如果f[i]==o[j],则dp[i][j]++:(采用了LCS的思想)
简单方法的AC代码:
//#include<string> //#include <iomanip> #include<vector> #include <algorithm> //#include<stack> #include<set> #include<queue> #include<map> //#include<unordered_set> #include<unordered_map> //#include <sstream> //#include "func.h" //#include <list> #include<stdio.h> #include<iostream> #include<string> #include<memory.h> #include<limits.h> using namespace std; /* 6 5 2 3 1 5 6 12 2 2 4 1 5 5 6 3 1 1 5 6 6 5 2 3 1 5 6 10 2 2 3 1 3 1 3 1 3 1 6 5 2 3 1 5 6 10 5 6 6 6 6 6 6 6 6 6 6 6 5 2 3 1 5 6 10 2 6 6 6 6 6 6 6 6 6 6 6 5 2 3 1 5 6 10 2 2 2 6 6 6 6 6 6 6 6 6 5 2 3 1 5 6 10 2 2 2 6 6 6 6 5 6 6 6 6 5 2 3 1 5 6 10 2 2 2 6 6 6 6 6 5 6 6 */ int main(void) { int colourSum,fnum, onum; cin >> colourSum>> fnum; vector<int> f(fnum); for (int i = 0; i<fnum; i++) { scanf("%d", &f[i]); } cin >> onum; vector<int> o(onum); for (int i = 0; i<onum; i++) { scanf("%d", &o[i]); } vector<vector<int>> dp(fnum+1, vector<int>(onum+1,0)); int thisMax = 0; for (int i = 1; i<=f.size(); i++) { for (int j = 1; j<=o.size(); j++) { dp[i][j] = max(max(dp[i - 1][j], dp[i][j - 1]), dp[i-1][j-1]); if (f[i-1] == o[j-1]) dp[i][j]++; } } cout << dp[fnum][onum] << endl; return 0; }
第一种方法AC代码:
//#include<string> //#include <iomanip> #include<vector> #include <algorithm> //#include<stack> #include<set> #include<queue> #include<map> //#include<unordered_set> #include<unordered_map> //#include <sstream> //#include "func.h" //#include <list> #include<stdio.h> #include<iostream> #include<string> #include<memory.h> #include<limits.h> using namespace std; /* 6 5 2 3 1 5 6 12 2 2 4 1 5 5 6 3 1 1 5 6 4 5 2 3 1 5 6 10 2 2 3 1 3 1 3 1 3 1 2 5 2 3 1 5 6 10 5 6 6 6 6 6 6 6 6 6 6 2 5 2 3 1 5 6 10 2 6 6 6 6 6 6 6 6 6 6 2 5 2 3 1 5 6 10 2 2 2 6 6 6 6 6 6 6 6 */ int main(void) { int colorSum,fnum, onum; cin >> colorSum>> fnum; vector<int> f(fnum); for (int i = 0; i<fnum; i++) {//输入喜欢的颜色 scanf("%d", &f[i]); } cin >> onum; vector<int> o(onum); for (int i = 0; i<onum; i++) {//输入源材料 scanf("%d", &o[i]); } vector<vector<int>> dp(fnum, vector<int>(onum)); for (int i = 0; i<f.size(); i++) {//初始化边界数组 if (f[i] == o[0]) dp[i][0] = 1; else if (i == 0) dp[i][0] = 0; else dp[i][0] = dp[i - 1][0]; } for (int i = 0; i<f.size(); i++) { for (int j = 1; j<o.size(); j++) { if (f[i] == o[j]) {//如果相等,那么dp[i][j]由dp[i][j-1]和dp[i-1][j-1]的最大值构成 if (i != 0) dp[i][j] = max(dp[i][j - 1] + 1, dp[i - 1][j - 1] + 1); else dp[i][j] = dp[i][j - 1] + 1; } else { if (i != 0) dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);//取包含上一个f的长度和不包含上一个f的长度两者最大值 else dp[i][j] = dp[i][j - 1]; } } } cout << dp[fnum - 1][onum - 1] << endl; return 0; }
相关文章推荐
- C++语法杂谈
- lintcode 中等题:Divide Two Integers 两个数的除法
- 聊一聊:相机篇2:光圈
- Mysql 常用命令
- webpack异步加载业务模块
- express4.x socket
- 最佳单例模式
- sleep和wait的区别
- Linux 数据重定向
- 一致性hash
- 杭电2647 Reward
- Java会出现"unreachable code"错误的几个例子
- volatile
- libc中的hook机制
- Eclipse错误集(一)
- 使用javaassist在内存中动态生成类
- BC #62 div1 02
- 【LeetCode OJ 009】Palindrome Number
- 《增长黑客:创业公司的用户与收入增长秘籍》----你的技术真的可以赚钱
- SQL基础--> 约束(CONSTRAINT)