题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1003
如果只是求最大区间
关键代码:
dp = max(a,a+dp);
ans = max(dp,ans)
#include <bits/stdc++.h>
using namespace std;
int a,ans,dp;
int main(){
int tcase,N;
cin>>tcase;
while(tcase--){
cin>>N;
ans = dp = 0;
for(int i=1;i<=N;i++){
cin>>a;
//不断更新
dp = max(a,a+dp);
ans = max(dp,ans);
}
cout<<ans<<endl;
}
return 0;
}
但是题目还要求出区间的起点和终点。
所有可以用dp数组来记录区间的值;
book数组来标记最大区间的开始位置。
结束位置就是i。
0x3f3f3f3f的十进制是1061109567,是10的9次方级别,可以看作无穷大,经常使用 。
#include <bits/stdc++.h>
using namespace std;
int a,ans,dp[100010],book[100010],l,r;//dp存储区间的值,book存储起点位置
const int INF = 0x3f3f3f3f;
int main(){
int tcase,N;
cin>>tcase;
for(int j =1;j<=tcase;j++)
{
//初始化
ans = -INF;
memset(dp,0,sizeof(dp));
memset(book,0,sizeof(book));
cin>>N;
book[0] = 1;
dp[0] = -INF;
for(int i=1;i<=N;i++){
cin>>a;
if(a+dp[i-1]>=a){
dp[i] = a + dp[i-1];
book[i] = book[i-1];
}
else{
dp[i] = a;
book[i] = i;
}
}
for(int i=1;i<=N;i++){
if(dp[i]>=ans){
ans = dp[i];
l = book[i];
r = i;
}
}
cout<<"Case "<<j<<":"<<endl;
cout<<ans<<" "<<l<<" "<<r<<endl;
if(j!=tcase){
cout<<endl;
}
}
return 0;
}