简单dp入门:
​​​题目链接​

思路比较简单想,暴力思路很简单,但是会TLE我试了一发,就枚举每一个区间即可

TLE代码:

#include<bits/stdc++.h>
using namespace std;
// max_sum
#define maxn 100005
int re_num[maxn];
int n;
void s_dp()
{
int i_x,i_y,max_sum=~0x3f3f3f3f;
for(int i=1; i<=n; i++)
{
int temp=0;
for(int j=i; j<=n; j++)
{
temp+=re_num[j];
if(temp>max_sum)
{
i_x=i;
i_y=j;
max_sum=temp;
}
}
}
printf("%d %d %d\n",max_sum,i_x,i_y);
}
int main()
{
int t,id=0;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&re_num[i]);
}
printf("Case %d:\n",++id);
s_dp();
if(t)
printf("\n");
}
}

dp写法:
其实是一种贪心思路,把前缀加起来,和当前状态比较如果小于就更新当前状态即可

动态转移方程
dp[i]=max(dp[i-1]+re_num[i],re_num[i])

AC代码:

#include<bits/stdc++.h>
using namespace std;
// slove max_sum
#define maxn 100005
int dp[maxn];
int re_num[maxn];
int n;
void s_dp()
{
int max_sum=~0x3f3f3f3f;
int id_end;
for(int i=1;i<=n;i++)
{
dp[i]=max(dp[i-1]+re_num[i],re_num[i]);
if(dp[i]>max_sum)
{
max_sum=dp[i];
id_end=i;
}
}//得到最大值
int sum=0,id_start;
for(int i=id_end;i>=1;i--)
{
sum+=re_num[i];
if(sum==max_sum)
{
id_start=i;
}
}
printf("%d %d %d\n",max_sum,id_start,id_end);
}
int main()
{

int t,id=0;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&re_num[i]);
}
printf("Case %d:\n",++id);
s_dp();
if(t)
printf("\n");
}
}