牛客 70E 烏龜跑步 bitset優化dp

2022-05-28 04:57:08 字數 1234 閱讀 4167

有乙隻烏龜,初始在0的位置向右跑。

這只烏龜會依次接到一串指令,指令t表示向後轉,指令f表示向前移動乙個單位。烏龜不能忽視任何指令。

現在我們要修改其中正好n個指令(乙個指令可以被改多次,一次修改定義為把某乙個t變成f或把某乙個f變成t)。

求這只烏龜在結束的時候離起點的最遠距離。(假設烏龜最後的位置為x,我們想要abs(x)最大,輸出最大的abs(x))

特判掉$n$過大的情況, 然後由貪心可以知道每個位置最多翻轉一次.

設$dp[0/1][i][j][k]$表示

第i步翻轉j次是否能達位置k且朝向為0/1.

用$bitset$優化轉移即可.

#include #include #include #include #include #include #include #include #include #include #include #define rep(i,a,n) for(int i=a;i<=n;++i)

#define per(i,a,n) for(int i=n;i>=a;--i)

#define hr putchar(10)

#define pb push_back

#define lc (o<<1)

#define rc (lc|1)

#define mid ((l+r)>>1)

#define ls lc,l,mid

#define rs rc,mid+1,r

#define x first

#define y second

#define io std::ios::sync_with_stdio(false)

#define endl '\n'

#define db(a) (

ll qpow(ll a,ll n)

ll inv(ll x)

inline int rd()

//head

const int n = 110;

int n, m;

char s[n];

bitset<2*n+10> f[2][n][55];

int main()

} else

} }int ans = 0;

rep(i,-m,m) if (f[0][m][n][i+n]||f[1][m][n][i+n]) ans = max(ans, abs(i));

printf("%d\n", ans);

}

牛客 烏龜跑步

有乙隻烏龜,初始在0的位置向右跑。這只烏龜會依次接到一串指令,指令t表示向後轉,指令f表示向前移動乙個單位。烏龜不能忽視任何指令。現在我們要修改其中正好n個指令 乙個指令可以被改多次,一次修改定義為把某乙個t變成f或把某乙個f變成t 求這只烏龜在結束的時候離起點的最遠距離。假設烏龜最後的位置為x,我...

牛客網 烏龜跑步 (dfs)

有乙隻烏龜,初始在0的位置向右跑。這只烏龜會依次接到一串指令,指令t表示向後轉,指令f表示向前移動乙個單位。烏龜不能忽視任何指令。現在我們要修改其中正好n個指令 乙個指令可以被改多次,一次修改定義為把某乙個t變成f或把某乙個f變成t 求這只烏龜在結束的時候離起點的最遠距離。假設烏龜最後的位置為x,我...

E 海嘯 牛客競賽

時間限制 c c 1秒,其他語言2秒 空間限制 c c 262144k,其他語言524288k 64bit io format lld 有乙個沿海地區,可以看作有n行m列的城市,第i行第j列的城市海拔為h i j 由於沿海,所以這個地區經常會發生海嘯。海嘯發生時,部分城市會被淹沒,具體來說,海水高度...