33,007
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define SIZE 55
char a[SIZE]={
9,44,32,12,7,42,34,92,35,37,41,8,20,
27,83,64,61,28,39,93,29,17,13,14,55,
21,66,72,23,73,99,1,2,88,77,3,65,83,
84,62,5,11,74,68,76,78,67,75,69,70,
22,71,24,25,26};
class CTimer
{
public:
__forceinline CTimer( void ) {
QueryPerformanceFrequency( (PLARGE_INTEGER)&m_nFreq );
QueryPerformanceCounter( (PLARGE_INTEGER)&m_nStart );
}
__forceinline void Reset( void ) {
QueryPerformanceCounter( (PLARGE_INTEGER)&m_nStart );
}
__forceinline double Stop( void ) {
QueryPerformanceCounter( (PLARGE_INTEGER)&m_nCur );
return double( m_nCur - m_nStart ) / double( m_nFreq );
}
__forceinline bool SelfTest( void ){
return ( 0 != QueryPerformanceFrequency( (PLARGE_INTEGER)&m_nFreq ) );
}
private:
__int64 m_nCur;
__int64 m_nFreq;
__int64 m_nStart;
};
int main(){
int *lis;
int *r;
int i,j,k,t,x,y;
int len=SIZE;
CTimer tmr;
lis=(int*)malloc(sizeof(int)*len);
for(i=0;i<len;i++){
lis[i]=1;
for(j=0;j<i;j++) if(a[i]>a[j]&&lis[j]+1>lis[i]) lis[i]=lis[j]+1;
}
k=0;
for(i=0;i<len;i++){
if(lis[i]>k){
k=lis[i];j=i;
}
}
r=(int*)malloc(sizeof(int)*k);
t=1;x=j;r[k-1]=a[j];y=k-2;
for(i=j-1;i>=0;i--){
if(lis[i]==k-t&&a[i]<a[x]){
r[y--]=a[i];t++;x=i;
}
}
printf("use time: %f ms\n",tmr.Stop() * 1000.0);
printf("max len: %d\n",k);
for(i=0;i<k;i++) printf("%d, ",r[i]);printf("\n");
free(r);free(lis);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#define SIZE 55
char a[SIZE]={
9,44,32,12,7,42,34,92,35,37,41,8,20,
27,83,64,61,28,39,93,29,17,13,14,55,
21,66,72,23,73,99,1,2,88,77,3,65,83,
84,62,5,11,74,68,76,78,67,75,69,70,
22,71,24,25,26};
class CTimer
{
public:
__forceinline CTimer( void ) {
QueryPerformanceFrequency( (PLARGE_INTEGER)&m_nFreq );
QueryPerformanceCounter( (PLARGE_INTEGER)&m_nStart );
}
__forceinline void Reset( void ) {
QueryPerformanceCounter( (PLARGE_INTEGER)&m_nStart );
}
__forceinline double Stop( void ) {
QueryPerformanceCounter( (PLARGE_INTEGER)&m_nCur );
return double( m_nCur - m_nStart ) / double( m_nFreq );
}
__forceinline bool SelfTest( void ){
return ( 0 != QueryPerformanceFrequency( (PLARGE_INTEGER)&m_nFreq ) );
}
private:
__int64 m_nCur;
__int64 m_nFreq;
__int64 m_nStart;
};
int main(){
int *lis;
char *map;
int *r;
int i,j,k,t,x;
int len;
CTimer tmr;
len=SIZE;
lis=(int*)malloc(sizeof(int)*len);
map=(char*)malloc(sizeof(char)*len);
memset(lis,0,sizeof(int)*len);
memset(map,0,sizeof(char)*len);
for(i=0;i<len;i++){
lis[i]=1;
for(j=0;j<i;j++){
if(a[i]>a[j]&&lis[j]+1>lis[i]){
lis[i]=lis[j]+1;
}
}
}
k=0;
for(i=0;i<len;i++){
if(lis[i]>k){
k=lis[i];j=i;
}
}
r=(int*)malloc(sizeof(int)*k);
t=1;x=j;map[j]=1;
for(i=j-1;i>=0;i--){
if(lis[i]==k-t&&a[i]<a[x]){
map[i]=1;t++;x=i;
}
}
j=0;
for(i=0;i<len;i++) if(map[i]==1) r[j++]=a[i];
printf("use time: %f ms\n",tmr.Stop() * 1000.0);
printf("max len: %d\n",k);
for(i=0;i<k;i++) printf("%d, ",r[i]);printf("\n");
free(r);free(map);free(lis);
return 0;
}