竟然没有人写题解2333那本蒟蒻就来H2O一篇吧
首先,看完题面不难想到DP,之后再看数据范围考虑O(N3)DP,之后瞎搞一通可以想到
f[i][j]表示在前i个里面经历k次出逃可以取到最少的修改数
那么接下来我们就发现f[i][j]可以影响的范围为f[u][j+1](i<u≤n),然后我们就可以写出如下的程序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| #include<bits/stdc++.h>
using namespace std;
int Num[110]; int Cnt[110][110]; int f[110][110];
int main(){ memset(f, 127, sizeof(f)); int n; scanf("%d", &n); for(int i = 1; i <= n; i++) scanf("%d", &Num[i]);
for(int i = 0; i <= n; i++){ int Cou = 0; for(int j = i; j <= n; j++){ if(Num[j] != j - i) Cou++; Cnt[i][j] = Cou; } } f[0][0] = 0; for(int i = 0; i <= n; i++) for(int j = 1; j <= n; j++) for(int u = i+1; u <= n; u++) if(f[u][j] > f[i][j-1] + Cnt[i+1][u]) f[u][j] = f[i][j-1] + Cnt[i+1][u]; for(int i = 1; i <= n; i++) printf("%d\n", f[n][i]); }
|