9.2.2(矩形嵌套_简单动态规划)
来源:互联网 发布:开淘宝店怎么上传照片 编辑:程序博客网 时间:2024/05/18 12:31
晕死了,,总算找到了自己错在哪里了,,,
人家标程用的dp求法是记忆化搜索,,
你的那个记忆化虽然是有了,,,但是,你没有一次性将结果用好,
也就是你没有一次dp就把结果存过去,
看代码吧:
#include <stdio.h>#include <string.h>#include <iostream>#include <string>#define max(a, b) (a) > (b) ? (a) : (b)using namespace std;struct node{int a;int b;}q[1005];int n;int map[1005][1005];int d[1005];bool Judge(int i, int j){if (q[i].a < q[j].a && q[i].b < q[j].b || q[i].a < q[j]. b && q[i].b < q[j].a){return true;}return false;}int dp(int i){//当然这里的ans你也可以直接用d[i]来表示, 但是如果一旦出现了多维的数组的话,,,ans就显示出他的优越性了 int &ans = d[i]; // 而这就是这道题目的精髓,就是你TLE与不TLE的差距,如果你没有这句话,就多算好多,有了就算一次, if (ans > 0) // 这是记忆化搜索的精髓,就是看看是不是已经得出d[i]; 如果得出就不必再计算了, {return ans;}ans = 1;for (int j = 0; j < n; j++){if (map[j][i]){ans = max(ans, dp(j) + 1);}} return ans;}int main(){int T;scanf("%d", &T);while (T--){memset(map, 0, sizeof(map));scanf("%d", &n);//if (n == 0)//{//printf("-1\n");//continue;//}for (int i = 0; i < n; i++){scanf("%d%d",&q[i].a, &q[i].b);}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (Judge(i, j)){//cout << "i = " << i << " " << "j = " << j << endl; map[i][j] = 1;}}}int t = 0;memset(d, 0, sizeof(d));for (int i = 0; i < n; i++){d[i] = dp(i);//printf("dp[%ds] = %d", i + 1, d[i]);//cout << endl;t = max(t, d[i]);}printf("%d\n", t);}//system("pause");return 0;}
再修改一下下,能够按照字典序输出:
你的矩形的编号:
#include <stdio.h>#include <string.h>#include <iostream>#include <string>#define max(a, b) (a) > (b) ? (a) : (b)using namespace std;struct node{int a;int b;}q[1005];int n;int cnt;int map[1005][1005];int d[1005];int seq[1005];bool Judge(int i, int j){if (q[i].a < q[j].a && q[i].b < q[j].b || q[i].a < q[j]. b && q[i].b < q[j].a){return true;}return false;}void print_ans(int i){//printf("%d ", i + 1);for (int j = 0; j < n; j++){if (map[j][i] == 1 && d[i] == d[j] + 1){seq[cnt++] = j + 1;print_ans(j);break;}}} int dp(int i){//当然这里的ans你也可以直接用d[i]来表示, 但是如果一旦出现了多维的数组的话,,,ans就显示出他的优越性了 int &ans = d[i]; // 而这就是这道题目的精髓,就是你TLE与不TLE的差距,如果你没有这句话,就多算好多,有了就算一次, if (ans > 0) // 这是记忆化搜索的精髓,就是看看是不是已经得出d[i]; 如果得出就不必再计算了, {return ans;}ans = 1;for (int j = 0; j < n; j++){if (map[j][i]){ans = max(ans, dp(j) + 1);}} return ans;}int main(){int T;scanf("%d", &T);while (T--){memset(map, 0, sizeof(map));scanf("%d", &n);//if (n == 0)//{//printf("-1\n");//continue;//}for (int i = 0; i < n; i++){scanf("%d%d",&q[i].a, &q[i].b);}for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){if (Judge(i, j)){//cout << "i = " << i << " " << "j = " << j << endl; map[i][j] = 1;}}}int t = 0;int flag;memset(d, 0, sizeof(d));int i;for (i = 0; i < n; i++){d[i] = dp(i);//printf("dp[%ds] = %d", i + 1, d[i]);//cout << endl;//t = max(t, d[i]);if (t < d[i]){t = d[i];flag = i;}}cnt = 0;seq[cnt++] = flag + 1;print_ans(flag);for (int j = cnt - 1; j >= 0; j--){printf("%d ", seq[j]);}printf("\n");printf("%d\n", t); }system("pause");return 0;}
- 9.2.2(矩形嵌套_简单动态规划)
- 嵌套矩形 动态规划
- 动态规划求解矩形嵌套
- 动态规划算法:嵌套矩形
- 矩形嵌套(动态规划)
- DP动态规划-嵌套矩形
- NYOJ 16 矩形嵌套(动态规划)
- 动态规划入门之嵌套矩形
- 【矩形嵌套 16 动态规划 NYOJ】
- NYOJ-16 矩形嵌套 动态规划
- nyoj16矩形嵌套(动态规划)
- NYOJ 16 矩形嵌套(动态规划)
- nyoj--16--矩形嵌套(动态规划)
- NYOJ-16-矩形嵌套(动态规划)
- 动态规划——矩形嵌套问题
- 矩形嵌套-DAG上的动态规划
- DAG上的动态规划--嵌套矩形
- NYOJ 16 (动态规划之嵌套矩形)
- DLL中传递STL参数,vector对象作为dll参数传递等问题
- 物联网
- __FILE__,__LINE__,FUNCTION__实现代码跟踪调试(linux下c语言编程)
- [设计模式]备忘录模式(Memento)
- js鼠标滑轮滚动事件绑定(兼容主流浏览器)
- 9.2.2(矩形嵌套_简单动态规划)
- vim使用技巧
- 九度OJ 1035 09浙大真题之优先队列堆排序之《寻找大富翁》
- AIX启动过程
- linux创建ftp用户以及指定目录问题
- 【面试题】数组中有两个元素出现了奇数次,其他元素出现了偶数次。找出这两个元素
- ubuntu10.10 软件源(当前ubuntu10.10不再官方支持更新,但是此软件源可用)
- ubuntu系统下root的使用
- lucene入门整理