A1007
#include<iostream>
using namespace std
;
const int maxn
=100004;
int fac
[maxn
],dp
[maxn
],s
[maxn
]={0};
int n
;
int main()
{
cin
>> n
;
bool flag
=true;
for(int i
=0; i
<n
; i
++)
{
cin
>> fac
[i
];
if(fac
[i
]>=0)
flag
=false;
}
if(flag
==true)
{
cout
<< 0 << " " << fac
[0] << " " << fac
[n
-1];
return 0;
}
dp
[0]=fac
[0];
for(int i
=1; i
<n
; i
++)
{
if(dp
[i
-1]+fac
[i
]>fac
[i
])
{
dp
[i
]=dp
[i
-1]+fac
[i
];
s
[i
]=s
[i
-1];
}
else
{
dp
[i
]=fac
[i
];
s
[i
]=i
;
}
}
int k
=0;
for(int i
=0; i
<n
; i
++)
{
if(dp
[i
]>dp
[k
])
k
=i
;
}
cout
<< dp
[k
] << " " << fac
[s
[k
]] << " " << fac
[k
];
return 0;
}
A1045
#include<iostream>
#include<cstring>
using namespace std
;
const int maxn
=10004;
int fac
[maxn
],HashTable
[maxn
],dp
[maxn
];
int n1
,n
,m
;
int main()
{
cin
>> n1
>> n
;
int temp
,num
=0;
memset(HashTable
,-1,sizeof(HashTable
));
for(int i
=0; i
<n
; i
++)
{
cin
>> temp
;
HashTable
[temp
]=num
++;
}
cin
>> m
;
int num1
=0;
for(int i
=0; i
<m
; i
++)
{
cin
>> temp
;
if(HashTable
[temp
]>=0)
fac
[num1
++]=HashTable
[temp
];
}
int ans
=-1;
for(int i
=0; i
<num1
; i
++)
{
dp
[i
]=1;
for(int j
=0; j
<i
; j
++)
{
if(fac
[j
]<=fac
[i
] && dp
[j
]+1>dp
[i
])
dp
[i
]=dp
[j
]+1;
}
ans
=max(ans
,dp
[i
]);
}
cout
<< ans
;
return 0;
}
#include<iostream>
using namespace std
;
const int maxn
=10004;
int n
,n1
,m
;
int A
[maxn
],B
[maxn
],dp
[maxn
][maxn
];
int main()
{
cin
>> n
>> n1
;
for(int i
=1; i
<=n1
; i
++)
{
cin
>> A
[i
];
}
cin
>> m
;
for(int i
=1; i
<=m
; i
++)
{
cin
>> B
[i
];
}
for(int i
=1; i
<=n1
; i
++)
dp
[i
][0]=0;
for(int i
=1; i
<=m
; i
++)
{
dp
[0][i
]=0;
}
for(int i
=1; i
<=n1
; i
++)
for(int j
=1; j
<=m
; j
++)
{
if(A
[i
]==B
[j
])
dp
[i
][j
]=max(dp
[i
-1][j
],dp
[i
][j
-1])+1;
else
dp
[i
][j
]=max(dp
[i
-1][j
],dp
[i
][j
-1]);
}
cout
<< dp
[n1
][m
];
return 0;
}
A1040
#include<iostream>
#include<string>
using namespace std
;
const int maxn
=1040;
int dp
[maxn
][maxn
];
string s
;
int main()
{
getline(cin
,s
);
int len
=s
.size();
int ans
;
for(int i
=0; i
<len
; i
++)
{
ans
=1;
dp
[i
][i
]=1;
if(i
<len
-1)
{
if(s
[i
]==s
[i
+1])
{
dp
[i
][i
+1]=1;
ans
=2;
}
}
}
for(int l
=3; l
<=len
; l
++)
for(int i
=0; i
+l
-1<len
; i
++)
{
int j
=i
+l
-1;
if(s
[i
]==s
[j
] && dp
[i
+1][j
-1]==1)
{
dp
[i
][j
]=1;
ans
=l
;
}
}
cout
<< ans
;
return 0;
}
A1068
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std
;
const int maxn
=10005;
const int maxv
=104;
int n
,m
;
int dp
[maxn
],w
[maxn
];
vector
<int> pre
;
bool choice
[maxn
][maxn
];
bool cmp(int a
, int b
)
{
return a
>b
;
}
int main()
{
cin
>> n
>> m
;
for(int i
=1; i
<=n
; i
++)
{
cin
>> w
[i
];
}
sort(w
+1,w
+n
+1,cmp
);
for(int i
=1; i
<=n
; i
++)
for(int v
=m
; v
>=w
[i
]; v
--)
{
if(dp
[v
]<=dp
[v
-w
[i
]]+w
[i
])
{
dp
[v
]=dp
[v
-w
[i
]]+w
[i
];
choice
[i
][v
]=true;
}
else
{
choice
[i
][v
]=false;
}
}
if(dp
[m
]!=m
)
cout
<< "No Solution";
else
{
int index
=n
,v
=m
;
while(v
>0)
{
if(choice
[index
][v
]==true)
{
pre
.push_back(w
[index
]);
v
-=w
[index
];
}
index
--;
}
for(int i
=0; i
<pre
.size(); i
++)
{
if(i
!=0)
cout
<< " ";
cout
<< pre
[i
];
}
}
return 0;
}
转载请注明原文地址: https://lol.8miu.com/read-3637.html