题目链接 :https://cn.vjudge.net/problem/Gym-101473I#
题目大意:在一个环上有N个洞,2种长度不同数量无限的补丁。问最少用多少长度的补丁能修复环。
N<=1000
环的周长<=1e6
1.显然这是一个环形的dp,一般来说会把链再复读一遍连在尾端。
2.开始考虑dp,以环上的位置为状态,开一个dp[2e6],然后考虑O(N)转移,但是发现这样并不能处理环。因为我们不能用dp[x+m]-dp[x]当作从x开始的环的结果,既dp数组并没有差分性质。
3.那么我们枚举环的起点,然后就可以把环转换为链了。
4.用当前在处理第几个洞当作状态,开一个dp[2*N],然后进行转移,可以O(N^3)通过。
ps:当然实际小于N^3
#include <bits/stdc++.h>
#define ll long long
#define mp make_pair
#define pb push_back
#define sec second
#define fir first
#define rep(i,a,b) for(int i = (a); i <= (b); i++)
#define per(i,a,b) for(int i = (a); i >= (b); i--)
#define all(x) (x).begin(), (x).end()
#define SZ(x) ((int)(x).size())
using namespace std;
const int N &