ZOJ 1108(FatMouse's Speed)

来源:互联网 发布:java写接口供别人调用 编辑:程序博客网 时间:2024/05/17 01:58

//经典dp

//难点在于序列路径的输出(使用“前驱法”)

#include<iostream>#include<algorithm>using namespace std;int dp[1001], pre[1001];struct mice{int order; //记住初始时各只老鼠的顺序,避免后面操作时打乱int weight;int speed;}m[1001];bool cmp(mice &m1, mice&m2) //这里不使用二级结构体排序也可以直接AC{return (m1.weight < m2.weight);}void output(int i) //递归后,正向输出路径{if (pre[i] == 0){cout << m[i].order << endl;return;}output(pre[i]);cout << m[i].order << endl;}int main(void){//freopen("Text.txt", "r", stdin);int i = 1, total, ans = 0, ans_index;while (cin >> m[i].weight >> m[i].speed){pre[i] = 0;//千万千万不要简写成  m[i].order=i++;,WA了一下午//之前自己写的第一个程序直接就AC了,后来看到别人用这个i++就学别人了,结果一直WA//,又不知道原因m[i].order = i;  i++;}total = i - 1;sort(m + 1, m + total + 1, cmp);for (int i = 1; i <= total; i++){dp[i] = 1;for (int j = 1; j < i; j++){if (m[j].speed > m[i].speed&&m[j].weight < m[i].weight&&(dp[i] < dp[j] + 1)){dp[i] = dp[j] + 1;pre[i] = j; //记录j的前驱是i,以利于后面路径的输出}}if (ans < dp[i]){ans = dp[i];ans_index = i;}}cout << ans << endl;output(ans_index);return 0;}///////////////////////////////////////////////////////////// 常规的路径输出方法,定义一个路径数组存储路径include<iostream>#include<algorithm>using namespace std;int dp[1001], pre[1001],route[1001];struct mice{int order;int weight;int speed;}m[1001];bool cmp(mice &m1, mice&m2){return (m1.weight < m2.weight);}int main(void){//freopen("Text.txt","r",stdin);int i = 1, total, ans = 0, ans_index;while (cin >> m[i].weight >> m[i].speed){pre[i] = 0;m[i].order = i;i++;}total = i - 1;sort(m + 1, m + total + 1, cmp);for (int i = 1; i <= total; i++){dp[i] = 1;for (int j = 1; j < i; j++){if (m[j].speed > m[i].speed&&m[j].weight < m[i].weight && (dp[i] < dp[j] + 1)){dp[i] = dp[j] + 1;pre[i] = j;}}if (ans < dp[i]){ans = dp[i];ans_index = i;}}cout << ans << endl;//到这里已经知道路径数组的规模为ansint end = ans_index;for (int i = ans; i >= 1; --i) //这里反向存储,便于后面正向输出{route[i] = end;end = pre[end];}for (int i = 1; i <= ans; i++) cout << m[route[i]].order << endl;return 0;}