题目描述:https://www.cnblogs.com/zucc-31701019/p/14967899.html
https://zhuanlan.zhihu.com/p/526649048
这题贪心就可以了,强行动态规划有点勉强。但是也刚好练习一下动态规划吧。我们一般的动态规划都是dp[i]与dp[i-1]产生联系,但是这题不太一样,dp[i]与之前的0 ~ i-1 都有关系,因为无法确定前i-1本书最多可以叠放的书本里面,哪一本是放到最底层的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
struct Book {
int length;
int width;
};
void input_handler(char *p, struct Book *book, int *book_num)
{
int start = 0;
int book_num_tmp = 0;
char str_tmp[100];
char *data;
for (int i = 1; i < strlen(p) - 1; i++) {
if (p[i] == '[') {
start = i + 1;
} else if (p[i] == ']'){
strncpy(str_tmp, p + start, i - start);
data = strtok(str_tmp, ",");
book[book_num_tmp].length = atoi(data);
data = strtok(NULL, ",");
book[book_num_tmp].width = atoi(data);
book_num_tmp++;
}
}
*book_num = book_num_tmp;
}
int mycmp(const void *a, const void *b)
{
struct Book *aa = (struct Book *)a;
struct Book *bb = (struct Book *)b;
if (aa->length == bb->length) {
return aa->width - bb->width;
} else {
return aa->length - bb->length;
}
}
int main(void)
{
char str[1000] = {0};
int book_num;
struct Book book[100];
int res_max = 1;
gets(str);
input_handler(str, book, &book_num);
qsort(book, book_num, sizeof(struct Book), mycmp);
#if 0
/* 1、贪心 */
struct Book pre = book[0];
for (int i = 1; i < book_num; i++) {
printf("%d %d\n", book[i].length, book[i].width);
if (book[i].length > pre.length && book[i].width > pre.width) {
pre = book[i];
res_max++;
}
}
#endif
#if 1
/* 2、动态规划 */
int dp[100] = {0}; // 前i本书最多可以叠放多少本书, i从0开始
dp[0] = 1;
for (int i = 1; i < book_num; i++) {
dp[i] = 1; // 至少也可以放一本
for (int j = 0; j < i; j++) {
if (book[j].length < book[i].length && book[j].width < book[i].width) {
dp[i] = fmax(dp[i], dp[j] + 1);
}
}
res_max = fmax(res_max, dp[i]);
}
#endif
printf("%d\n", res_max);
return 0;
}