Uva - 111 - History Grading
2013-04-03 18:53
316 查看
题意:有n个事件,每个事件发生的年份都不同,输入n个事件发生的年份,输入学生作答时对于这n个事件的所排的年份,问最长学生排对了几个,不用连续。
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=114&problem=47
——>>理解题意重要,输入的是年份而不是事件,第i个位置为a表示第i个事件第a年发生;
状态转移方程:d[i] = max(d[i], d[j]+1);d[i]表示以第i个事件为终点的最长路;
另一个是输入方式,第一次用了while(1){}来输入学生答案,结果就TLE了,第二次改为先输入学生作答时的第一个年份,再输入剩余的n-1个年份,AC!
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&category=114&problem=47
——>>理解题意重要,输入的是年份而不是事件,第i个位置为a表示第i个事件第a年发生;
状态转移方程:d[i] = max(d[i], d[j]+1);d[i]表示以第i个事件为终点的最长路;
另一个是输入方式,第一次用了while(1){}来输入学生答案,结果就TLE了,第二次改为先输入学生作答时的第一个年份,再输入剩余的n-1个年份,AC!
#include <cstdio> #include <algorithm> using namespace std; const int maxn = 20 + 10; int main() { int n, cmp[maxn], a[maxn], d[maxn], i, j, temp; scanf("%d", &n); for(i = 1; i <= n; i++) scanf("%d", &cmp[i]); //事件i在第cmp[i]年发生 while(~scanf("%d", &temp)) { a[temp] = 1; for(i = 2; i <= n; i++) { scanf("%d", &temp); a[temp] = i; //学生作答:第temp年发生了事件i } for(i = 1; i <= n; i++) d[i] = 1; int ret = 1; for(i = 1; i <= n; i++) for(j = 1; j < i; j++) if(cmp[a[j]] < cmp[a[i]]) { d[i] = max(d[i], d[j]+1); ret = max(ret, d[i]); } printf("%d\n", ret); } return 0; }
相关文章推荐
- (DP6.1.4.1)UVA 111 History Grading(最长递增子序列LIS 的LCS 解法)
- UVA 111 History Grading (最长公共子序列)
- 【DP】UVA 111 History Grading
- UVa 111|History Grading|动态规划|最长上升子序列
- UVaOJ111 - History Grading
- UVa 111 - History Grading
- 【DP】UVA 111 History Grading
- 【解题报告】uva111_History Grading(历史考试, dp, LCS)
- uva 111 History Grading(最长公共子序列)
- uva 111 History Grading
- uva 111 A - History Grading
- uva111 - History Grading(最长公共子序列LCS)
- UVA 111 History Grading
- UVa 111 - History Grading
- uva111 - History Grading (最长公共子序列)
- Uva - 111 - History Grading
- UVA 111 History Grading
- UVA - 111 History Grading
- UVA - 111 History Grading (动态规划:LCS)
- UVa 111 History Grading (最长公共子序列)