题解 | #三子棋#

三子棋

https://ac.nowcoder.com/acm/contest/47914/A

G.

dpi,jdp_{i,j} 为考虑前 ii11 交换到第 jj 个时前ii11 均互不相邻的最小操作数。

枚举 jj 的同时从 j2j-2 开始往低位转移即可。

时间复杂度 O(n3)O(n^3)

#include<bits/stdc++.h>
using namespace std;
int dp[505][505];
string s;
int a[505];
int b[505];
int n;
int main()
{
    cin>>n;
    cin>>s;
    s = " "+s;
    int cnt = 0;
    memset(dp,0x3f3f3f3f,sizeof(dp));
    for(int i = 1;i<=n;++i)
        if(s[i]=='1')
            a[++cnt] = i;
    if(cnt>(n+1)/2)
    {
        cout<<-1<<'\n';
        return 0;
    }
    for(int i = 1;i<=n;++i)
        dp[1][i] = abs(i-a[1]);
    for(int i = 2;i<=cnt;++i)
        for(int j = i;j<=n;++j)
            for(int k = j-2;k>=i-1;--k)
                dp[i][j] = min(dp[i-1][k]+abs(j-a[i]),dp[i][j]);
    int ans = 0x3f3f3f3f;
    for(int i = 1;i<=n;++i)
        ans = min(ans,dp[cnt][i]);
    cout<<ans<<'\n';
    return 0;
}
全部评论
1 0 会wa
点赞 回复
分享
发布于 2022-12-03 00:26 湖北
确实,全0就wa了,数据还是弱了。特判一下就好了
点赞 回复
分享
发布于 2022-12-03 01:08 福建
联易融
校招火热招聘中
官网直投

相关推荐

4 收藏 评论
分享
牛客网
牛客企业服务