J
来源:互联网 发布:网络盗刷信用卡什么罪 编辑:程序博客网 时间:2024/05/08 17:53
Think:
1题目理解:T组测试数据,每组测试数据输入两串字符,求最大上升递增子序列
2思考:dp:通过状态转移方程优化节省内层一层for循环?
建议参考博客
参考:
题目大意:T种情况,每种情况2行数据,每行数据第一个表示个数,接下来是一个序列,问两组数据的最长公共递增子序列的长度。
解题思路:当看到这题想到的是LCS和LIS问题,没错这题也是动态规划问题,只要找到状态转移方程就可轻易搞定!
>_<:LIS设DP[i]表示以第i个数字结尾的最长上升子序列的长度
>0<:DP[i]=max(DP[j]+1){1<=j<=i-1}
>_<:LCS设DP[i][j]表示以A串第i个字符结尾以B串第j个字符结尾的最长字串
>0<:当a[i]==b[j]时:DP[i][j]=DP{i-1][j-1]+1;
当a[i]!=b[j]时:DP[i][j]=max(DP[i-1][j],DP[i][j-1])
>_<:LCIS设F[i][j]表示以a串前i个字符b串的前j个字符且以b[j]为结尾构成的LCIS的长度
>0<:当a[i]!=b[j]时:F[i][j]=F[i-1][j]
当a[i]==b[j]时:F[i][j]=max(F[i-1][k])+1 1<=k<=j-1 && b[j]>b[k]
vjudge题目链接
以下为Accepted代码——借鉴+_dp——70ms
#include <bits/stdc++.h>using namespace std;int f[1004][1004], a[1004], b[1004];int main(){ int T, n, m, i, j; scanf("%d", &T); while(T--){ scanf("%d", &n); for(i = 1; i <= n; i++) scanf("%d", &a[i]); scanf("%d", &m); for(i = 1; i <= m; i++) scanf("%d", &b[i]); memset(f, 0, sizeof(f)); for(i = 1; i <= n; i++){ int mav = 0; for(j = 1; j <= m; j++){ if(a[i] > b[j] && mav < f[i-1][j])/*更新mav*/ mav = f[i-1][j]; if(a[i] != b[j]) f[i][j] = f[i-1][j]; else if(a[i] == b[j]) f[i][j] = mav + 1; } } int mav = 0; for(i = 1; i <= m; i++) mav = max(mav, f[n][i]); printf("%d\n", mav); } return 0;}
以下为Accepted代码——借鉴+_暴力——440ms
#include <bits/stdc++.h>using namespace std;int f[1004][1004], a[1004], b[1004];int main(){ int T, n, m, i, j, k; scanf("%d", &T); while(T--){ scanf("%d", &n); for(i = 1; i <= n; i++) scanf("%d", &a[i]); scanf("%d", &m); for(i = 1; i <= m; i++) scanf("%d", &b[i]); memset(f, 0, sizeof(f)); for(i = 1; i <= n; i++){ for(j = 1; j <= m; j++){ if(a[i] != b[j]) f[i][j] = f[i-1][j]; else if(a[i] == b[j]){ int mav = 0; for(k = 1; k < j; k++) if(b[k] < b[j]) mav = max(mav, f[i-1][k]); f[i][j] = mav + 1; } } } int mav = 0; for(i = 1; i <= m; i++) mav = max(mav, f[n][i]); printf("%d\n", mav); } return 0;}
阅读全文
1 0
- J
- j
- j
- J#
- J
- J
- J
- J
- j
- J
- J
- J
- J
- J
- J
- J
- J
- J
- 再论Android最新架构—Google 官方Android开发新架构指南
- QQ登录
- LeetCode 483 Smallest Good Base 题解
- 三维计算几何模板--表面三角形个数 表面多边形个数 三维凸包 表面积 凸包重心 点到面的距离
- J
- J
- python3爬天气后报历史数据
- 7个处理javascript的`undefined`的tips
- Android6.x:权限列表
- 树链剖分
- Prime Path(广搜)
- React Native 实现注销登录功能
- STL空间配置器——第一级配置器__malloc_alloc_template剖析
- Eclipse ,ctrl+h,搜索,拼接正则表达式