DP 练习 uva103 Stacking Boxs

来源:互联网 发布:林非比的淘宝店铺 编辑:程序博客网 时间:2024/05/21 22:46
题目链接https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=3&page=show_problem&problem=39
#include <stdio.h>#define MAX_K 31#define MAX_N 11int k;// number of box, k<=30int n;// n dimensionality, 1 <= n <=10int boxs[MAX_K][MAX_N];int dp[MAX_K];// a box can be put into b boxbool canFit(int a, int b){// can not fit itselfif (a == b)return false;int i;for (i = 1; i <= n; i++){if (boxs[a][i] >= boxs[b][i])return false;}return true;}void print_ans(int i){printf("%d ", i);for (int j = 1; j <= k; j++){if (canFit(i, j) && dp[i] == dp[j] + 1){print_ans(j);break;}}}int memo(int i){int & ans = dp[i];if (ans > 0) return ans;ans = 1;for (int j = 1; j <= k; j++){if (canFit(i, j)){int tmp = memo(j) + 1;if (ans < tmp)ans = tmp;}}return ans;}////////////////////////////////void swap(int *a, int *b){int t;t = *a;*a = *b;*b = t;}int Partition(int a[], int low, int high){int x = a[high];int i = low - 1;for (int j = low; j <= high - 1; j++){if (a[j] <= x){i = i + 1;swap(&a[i], &a[j]);}}swap(&a[i + 1], &a[high]);return i + 1;}void QuickSort(int a[], int low, int high){if (low < high){int mid = Partition(a, low, high);QuickSort(a, low, mid - 1);QuickSort(a, mid + 1, high);}}int main(){int i, j;freopen("uva103_stackingboxs_input.txt", "r", stdin);while (scanf("%d %d", &k, &n) != EOF){for (i = 1; i <= k; i++){dp[i] = 0;for (j = 1; j <= n; j++){scanf("%d", &boxs[i][j]);}QuickSort(boxs[i], 1, n);}#ifdef DEBUGfor (i = 1; i <= k; i++){for (j = 1; j <= n; j++){printf("%d ", boxs[i][j]);}printf("\n");}#endif//int longest = 0;int start = 0;for (i = 1; i <= k; i++){int tmp = memo(i);if (longest < tmp){longest = tmp;start = i;}}//printf("%d\n", longest);print_ans(start);printf("\n");}return 0;}

0 0
原创粉丝点击