思路:
- 裸的 dp,十分简单,第一次没查题解就顺利做出来了。
- 其实,dp 的关键就在 dp[i] 代表必须使用物品 i,以及 dp 和枚举的综合使用。
- 注意,一旦 dp[i] 代表必须,则 ans 不要忘记。
代码:
#include <iostream>
#include <algorithm>
#include <cstring>
#define INF 0x3f3f3f3f
using namespace std;
const int maxn = 1e3 + 5;
int N;
int ans;
int dp[maxn];
int V[maxn] ;
void INIT(){
ans = -INF;
memset(dp , -INF , sizeof(dp));
return ;
}
int main(){
while(cin>>N && N){
INIT();
for(int i=1;i<=N;i++)
scanf("%d" , V + i);
dp[0] = 0;
for(int i=1;i<=N;i++){
for(int j=0;j<i;j++)
if(V[j] < V[i])
dp[i] = max(dp[i] , dp[j] + V[i]);
ans = max(ans , dp[i]);
}
cout<<ans<<endl;
}
return 0;
}
二刷:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1005;
int N;
int dp[maxn];
int w[maxn];
int main(){
while(cin>>N && N){
memset(dp , 0 , sizeof(dp));
for(int i=1;i<=N;i++)
cin>>w[i];
int MAX = 0;
for(int i=1;i<=N;i++){
dp[i] = w[i];
for(int j=1;j<i;j++)
if(w[j] < w[i])
dp[i] = max(dp[i] , dp[j] + w[i]);
MAX = max(MAX , dp[i]);
}
cout<<MAX<<endl;
}
return 0;
}