HDU 1160 FatMouse's Speed dp
这题是看杭电acm课件做的,和一维的最长有序子序列差不多。
先按mice的重量为第一关键字升序排序,再按mice的speed按降序排序,然后开始dp
对杭电课件那个记录数组的意义不理解。
num[i]是记录从0~i个mice的最长子序列,num[i] = max (num[j]+1, num[i]) , 0<= j < i
一开始用string保存路径输出,不断地WA,想了很久,才发现问题,我每次用一个char保存当前的节点,char是值是0~2^8,会越界
后来查考别人输出方法,每个节点保存一个前节点,最后一个递归输出即可。
对memset又加深了理解,memset不能对int数组赋值,例如不能给整个数组赋值为1, 它是按位赋值的,一个int是4个位,它会把所有位都赋值为1,得到的就不是1了。
#include <iostream> #include <algorithm> #define MAX 1005 using namespace std; struct Mice { int id; int weight; int speed; int pre; }; bool cmp(const Mice& a, const Mice& b) { if (a.weight < b.weight) return true; else if (a.weight == b.weight) return a.speed > b.speed; else return false; } int num[MAX]; Mice mice[MAX]; void output(int); int main() { int count = 0; while (cin >> mice[count].weight >> mice[count].speed) { mice[count].id = count+1; count++; } sort(mice, mice+count, cmp); num[0] = 1; mice[0].pre = 0; for (int i = 1; i < count; i++) { num[i] = 1; mice[i].pre = i; for (int j = 0; j < i; j++) { if (mice[i].weight > mice[j].weight && mice[i].speed < mice[j].speed) { if (num[i] < num[j]+1) { num[i] = num[j]+1; mice[i].pre = j; } } } } int max_index = 0; for (int i = 1; i < count; i++) if (num[i] > num[max_index]) max_index = i; cout << num[max_index] << endl; output(max_index); return 0; } void output(int index) { if (num[index] == 1) cout << mice[index].id << endl; else { output(mice[index].pre); cout << mice[index].id << endl; } }