刚把这题昨晚,顺便就用最大匹配把这题做了,不给思路了,直接上代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int num[20];
int f[20];
int ans = 1;
int from[20], used[20];
int map[20][20];
int n;
int find(int k)
{
int i;
for(i = 0; i < n; i++){
if(map[k][i] && !used[i]){
used[i] = 1;
if(from[i] == -1 || find(from[i])){
from[i] = k;
return 1;
}
}
}
return 0;
}
int main(int argc, char **argv)
{
int i = 1, j;
scanf("%d", &num[0]);
while(scanf(",%d", &num[i]) == 1){
i++;
}
n = i;
f[0] = 1;
for(i = 1; i < n; i++){
f[i] = 1;
for(j = 0; j < i; j++){
if(num[j] >= num[i] && f[i] < f[j] + 1){
f[i] = f[j] + 1;
}
}
if(ans < f[i]){
ans = f[i];
}
}
printf("%d,", ans);
for(i = 0; i < n; i++){
//因为只能按顺序打, 所以要从i + 1开始循环
for(j = i + 1; j < n; j++){
if(num[i] >= num[j]){
map[i][j] = 1;
}
}
}
for(i = 0; i < n; i++){
from[i] = -1;
}
for(i = ans = 0; i < n; i++){
memset(used, 0, sizeof(used));
if(find(i)){
ans++;
}
}
ans = n - ans;
printf("%d\n", ans - 1);
return 0;
}