E. Array Shrinking
题目大意
给你一个长度为n的数列,没两个相同的数字可以抵消,变成不这个数字大一的新数字,问你经过多次操作后,这一个数列最少省多少个。
解题思路
这是一个区间DP,,可能是我太菜了,我个人感觉就是换个姿势暴力枚举。我们可以用一个二维数组很巧妙的进行暴力的用DP来解决,让dp[i][j] 表示第 i之后的连续j个数进行一一抵消后会变成几,如果不能抵消就是0;然后再计算出来最多能抵消到少个数字,最后用总数减去抵消的就可以了。这个思路很容易,但是如何实行就比较麻烦了。直接看代码吧。
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mx=1e5+10;
const ll mod=1e9+7;
int dp[1010][1010];