n個時刻中每乙個時刻可以不叫,叫一聲或者叫兩聲。如果在第i
i個時刻叫一聲會得到aia
i的權值,叫兩聲得到ai2
ai2
的權值,但是下乙個時刻就不可以叫。求最大權值和。
很裸的dpd
p,設f[i
][0/
1/2]
f[i]
[0/1
/2]分別表示這只貓在第i
i個時刻不叫、叫一聲、叫兩聲的最大權值和。方程也是很明顯的,根據題目意思就可以推出來。這裡就直接給出方程f[
i][0
]=ma
x(f[
i−1]
[0],
f[i−
1][1
],f[
i−1]
[2])
f[i]
[0]=
max(
f[i−
1][0
],f[
i−1]
[1],
f[i−
1][2
])f[
i][1
]=ma
x(f[
i−1]
[0],
f[i−
1][1
])+a
[i]f
[i][
1]=m
ax(f
[i−1
][0]
,f[i
−1][
1])+
a[i]
f[i]
[2]=
max(
f[i−
1][0
],f[
i−1]
[1])
+a[i
]2f[
i][2
]=ma
x(f[
i−1]
[0],
f[i−
1][1
])+a
[i]2
最終答案取個最大值就可以了。
由於學校題庫的速度極慢,正常的o(n
)o(n
)演算法會被t飛。所以可以考慮採用小數+負數的快讀
,就可以輕鬆過了。
這裡簡單提幾句方法吧。對於負數快讀就只要在普通的快讀中增加乙個判斷前面是否有負號即可。而小數快讀的整數部分方法沒變,若讀到了小數點,那麼就開始讀小數部分,每次讀入的數字除以10x
(x=1
,2...)1
0x(x
=1,2
...)
,加到整數部分即可。
#include
#include
using
namespace std;
const
int n=
800010
;int n;
double a[n]
,f[n][3
];double
read()
while
(ch>=
'0'&&ch<=
'9')
//正常的整數讀入
d=d*10+
(double
)(ch-48)
,ch=
getchar()
;if(ch!=
'.')
return d*ff;
//如果沒有小數點就直接返回了
double cnt=10;
ch=getchar()
;while
(ch>=
'0'&&ch<=
'9')
//讀入小數
d=d+((
double
)(ch-48)
/cnt)
,ch=
getchar()
,cnt*
=10.0
;return d*ff;
}int
main()
printf
("%0.4lf\n"
,max
(f[n][0
],max(f[n][1
],f[n][2
])))
;return0;
}
SSLOJ 1296 貓咪的進化
傳送門 在每個單位時間內,有三種選擇,求如何組合能使得獲得的進化量 隨便打打dpdp dp,但畢竟是野雞ojoj oj上的題,以至於那麼小的n nn也要開個快讀 include include include include include include include include inclu...
貓咪的進化
題目描述 對於乙隻貓咪來說,它是有九條命的。但是並不是所有的貓咪都是這樣,只有那些造化很高的貓咪才能死而復生。而且對於這樣的貓咪,如果它能夠活到第九條命,那麼它最終可以變成任何一種它想成為的動物 當然也可以繼續做貓咪啦 我們稱這樣的貓咪為貓神。現在乙隻獲得了進化機會的貓咪,受到了女神snowharm...
DP 貓咪的進化
有n個實數,每乙個實數可以選,可以不選,也可以選擇它的平方,但如果選擇了它的平方,就不能選擇下乙個數或下乙個數的平方,求選出來的數的和最大是多少 對於乙隻貓咪來說,它是有九條命的。但是並不是所有的貓咪都是這樣,只有那些造化很高的貓咪才能死而復生。而且對於這樣的貓咪,如果它能夠活到第九條命,那麼它最終...