
Nguyên bản được gửi bởi
tanglung117
cho 1 mảng A,yêu cầu tìm mảng con dài nhất
ví dụ A=23 -8 -10 0 67 68 3 15 5 12 thì kết quả sẽ là -8 -10 0 3 5 12
các bạn cùng suy nghĩ nhá,lưu ý là không dùng thuật tóan vét cạn được với những test lớn cỡ 200 phần tử,mình xin gợi ý cách làm của mình là quy về đồ thị.
Quy hoạch động được không bạn
Code:
#include<conio.h>
#include<stdlib.h>
#include<stdio.h>
#include<iostream.h>
#define duongvocung 3200
#define amvocung -3200
int n,i,j,l[100],a[100];
static int k,max,jmax;
// k danh dau vi tri phan tu bat dau cua day con tang lon nhat
// n la do dai cua day
//l la mang chua do dai lon nhat cua tung phan tu khi tinh tu cuoi day
// a la mang chua cac phan tu
void nhap(){
clrscr();
cout<<"Dynamic prigramming\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
cout<<"\n";
cout<<"Tim day con tang dai nhat cua mot day\n\n\n\n\n\nSo phan tu cua day la:";
cin>>n;
cout<<"\n\n\n\n\n";
cout<<"Nhap cac phan tu cua day:\n";
for(i=1;i<=n;i++)
cin>>a[i];
}
//////////////////////////////////////////
/// day la ham tim do dai day con tang lon nhat
void tinh_f()
{
a[n+1]=duongvocung;//a[n+1]=3200 phan tu duong vo cung
l[n+1]=1;//do dai phan tu duong vo cung la 1
a[0]=amvocung;//a[0]=-3200 phan tu am vo cung
for(i=n;i>=0;i--)
{
jmax=n+1;
for(j=n+1;j>=i+1;j--)
if(a[i]<a[j]&&l[j]>=l[jmax])
{
jmax=j;
l[i]=l[j]+1;
}
}
}
///////////////////////////////////////////////////////////////////////
// ham xemday()in ra day ban da nhap
void xemday(){
for(i=1;i<=n;i++)
cout<<" "<<a[i];
}
////////////////////////////////////////////////
//ham tim_max() in ra do dai day con tang lon nhat
void tim_max(){
int t=0;
max=l[1];
for(i=1;i<=n;i++)
if(max<=l[i]){
max=l[i];
k=i;
}
for(i=k;i<=n;i++)
if(max-l[i]==t&&a[i]>=a[k])
{
cout<<" "<<a[i];
t++;
}
}
///////////////////////////////////////////////////////////////////
void main(){
nhap();
cout<<"day ban da nhap:\n";
xemday();
cout<<"\n";
tinh_f();
cout<<"day ket qua la:\n";
tim_max();
getch();
}