HDU 1003 dp
解題思路:這道題是典型的求最大連續子序列,並且輸出 最大連續子序列的第一個元素的位置和最後一個元素的位置
核心dp方程爲sum[i] = max(sum[i - 1] + data[i],data[i])
以核心dp方程的思想去考慮這道題,若以傳統的方式去用數組存儲整個序列,不僅代碼繁瑣,並且效率不是很高,
沒輸出一個數字,對其進行操作,用兩個for循環既可以記錄樣例的編號,又可以清晰記錄最大連續子序列的起始位置和
終止位置
#include<cstdio>
using namespace std;
int main()
{
int t,sum,max;
int data,start,End;
int a, b, A,B,n;
scanf("%d",&t);
for(int i = 1; i <= t; i++)
{
sum = max = -10001;
scanf("%d",&n);
for(int j = 1; j <=n; j++)
{
scanf("%d",&data);
if(sum + data < data)
{
sum = data;
a = b = j;
}
else
{
sum += data;
++b;//應該是++b,而不是b++,因爲要判斷加上當前的這個數時,新sum是否比舊sum小
}
if(max<sum)//將當前的最大的值保存在Max中,在樣例中就有體現
{
max = sum; A = a;
B = b;
}
}
printf("Case %d:\n%d %d %d\n",i,max,A,B);
if(i != t)
printf("\n");
}
return 0;
}
核心dp方程爲sum[i] = max(sum[i - 1] + data[i],data[i])
以核心dp方程的思想去考慮這道題,若以傳統的方式去用數組存儲整個序列,不僅代碼繁瑣,並且效率不是很高,
沒輸出一個數字,對其進行操作,用兩個for循環既可以記錄樣例的編號,又可以清晰記錄最大連續子序列的起始位置和
終止位置
#include<cstdio>
using namespace std;
int main()
{
int t,sum,max;
int data,start,End;
int a, b, A,B,n;
scanf("%d",&t);
for(int i = 1; i <= t; i++)
{
sum = max = -10001;
scanf("%d",&n);
for(int j = 1; j <=n; j++)
{
scanf("%d",&data);
if(sum + data < data)
{
sum = data;
a = b = j;
}
else
{
sum += data;
++b;//應該是++b,而不是b++,因爲要判斷加上當前的這個數時,新sum是否比舊sum小
}
if(max<sum)//將當前的最大的值保存在Max中,在樣例中就有體現
{
max = sum; A = a;
B = b;
}
}
printf("Case %d:\n%d %d %d\n",i,max,A,B);
if(i != t)
printf("\n");
}
return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.