【8.28校内测试】【区间DP】

感受到了生活的艰辛QAQ...这才是真正的爆锤啊...(因为t1t3还没有理解所以只能贴t2叻QAQ

【8.28校内测试】【区间DP】

区间DP...爆哭把题理解错了,以为随着拿的东西越来越多,断点也会越来越多,出现可以选很多的情况QAQ,然而是不会的,自始至终只会有一个断点,哥哥和妹妹取都只有两个方向,而妹妹还是强制选择的QAQ。

所以把环展开就是一个区间DP叻,枚举长度(长度作为层数)、区间,因为是从长度小的转移到长度多的,区间根据长度的奇偶性可以判断当前该谁拿,如果是妹妹,就在两端取大的更新区间(不加dp值),如果是哥哥就往两边都更新。

#include<iostream>
#include<cstdio>
#include<cstring>
#define LL long long
using namespace std; LL dp[][], a[];
int n; int main ( ) {
freopen ( "cake.in", "r", stdin );
freopen ( "cake.out", "w", stdout );
scanf ( "%d", &n );
for ( int i = ; i <= n; i ++ ) scanf ( "%d", &a[i] ), a[i+n] = a[i];
int nn = n << ;
memset ( dp, -, sizeof ( dp ) );
for ( int i = ; i <= nn; i ++ ) dp[i][i] = a[i];
for ( int len = ; len <= n; len ++ )
for ( int i = ; i < nn - len + ; i ++ ) {
int j = i + len - ;
if ( dp[i][j] > ) {
if ( len & ) {
if ( a[i-] < a[j+] ) dp[i][j+] = max ( dp[i][j+], dp[i][j] );
else dp[i-][j] = max ( dp[i-][j], dp[i][j] );
} else {
dp[i-][j] = max ( dp[i-][j], dp[i][j] + a[i-] );
dp[i][j+] = max ( dp[i][j+], dp[i][j] + a[j+] );
}
}
}
LL ans = ;
for ( int i = ; i <= nn - n + ; i ++ )
ans = max ( ans, dp[i][i+n-] );
printf ( "%I64d", ans );
return ;
}

虽然题没有改完,但是杀了只猪都不吃风风吹牛羊槽鸭鸡!!!!!!!rzrzrzrzrzrzrzrzrzrzrzrzrzrzrzrzrzrz_Ruben笨

上一篇:What is Zeebe?


下一篇:三、postman测试断言设置语法