rt 一开始只拿了十分,后来改了一下,就过了,但感觉没什么区别呀,有大佬愿意给蒟蒻解答吗
10分代码如下
#include<bits/stdc++.h>
using namespace std ;
#define maxn 3100
#define int long long
#define kkk signed main
inline int read(){
int ans = 0 , f = 1 ; char ch = getchar() ;
while ( ch < '0' || ch > '9') { if( ch == '-' ) f = -1 ; ch = getchar() ; }
while ( ch >= '0' && ch <= '9' ) ans = ( ans << 3 ) + ( ans << 1 ) + ch - '0' , ch = getchar() ;
return ans * f ;
}
#define re register int
#define lc (o << 1)
#define rc ((o << 1) | 1)
#define mid ((l + r) >> 1)
int n , a[maxn] ;
int f[maxn][maxn] ;
kkk(){
// freopen("test.in" , "r" , stdin) ;
// freopen("test.out" , "w" , stdout) ;
memset(f , 127 , sizeof(f)) ;
n = read() ;
for(int i = 1 ; i <= n ; i++){
a[i] = read() ;
f[i][i] = 0 ;
if(i != 1){
if(a[i] == a[i - 1])
f[i - 1][i] = 0 ;
else f[i - 1][i] = 1 ;
}
}
for(int len = 2 ; len <= n ; len++)
for(int i = 1 ; i + len - 1 <= n ; i++){
int j = i + len - 1 ;
if(a[i] == a[j]) f[i][j] = min(f[i + 1][j - 1] , f[i][j]) ;
f[i][j] = min(f[i][j] , f[i + 1][j - 1] + 1) ;
f[i][j] = min(f[i][j] , f[i][j - 1] + 1 + 1) ;
f[i][j] = min(f[i][j] , f[i + 1][j] + 1 + 1) ;
}
cout << f[1][n];
}
满分代码如下
#include<bits/stdc++.h>
using namespace std ;
#define maxn 3100
#define int long long
#define kkk signed main
inline int read(){
int ans = 0 , f = 1 ; char ch = getchar() ;
while ( ch < '0' || ch > '9') { if( ch == '-' ) f = -1 ; ch = getchar() ; }
while ( ch >= '0' && ch <= '9' ) ans = ( ans << 3 ) + ( ans << 1 ) + ch - '0' , ch = getchar() ;
return ans * f ;
}
#define re register int
#define lc (o << 1)
#define rc ((o << 1) | 1)
#define mid ((l + r) >> 1)
int n , a[maxn] ;
int f[maxn][maxn] ;
kkk(){
// freopen("test.in" , "r" , stdin) ;
// freopen("test.out" , "w" , stdout) ;
memset(f , 127 , sizeof(f)) ;
n = read() ;
for(int i = 1 ; i <= n ; i++){
a[i] = read() ;
f[i][i] = 0 ;
if(i != 1){
if(a[i] == a[i - 1])
f[i - 1][i] = 0 ;
else f[i - 1][i] = 1 ;
}
}
for(int len = 2 ; len <= n ; len++)
for(int i = 1 ; i + len - 1 <= n ; i++){
int j = i + len - 1 ;
if(a[i] == a[j]) f[i][j] = min(f[i + 1][j - 1] , f[i][j]) ;
else f[i][j] = min(min(f[i + 1][j] , f[i][j - 1]) , f[i + 1][j - 1]) + 1 ;
}
cout << f[1][n];
}