首页 > 代码库 > UVA 11552 Fewest Flops
UVA 11552 Fewest Flops
题解:
也是比较简单的DP
dp[i][j]表示第i个。以字母j结尾的最小值
注意小trick. 整个分组都同一个字母,这时候就不用判断头尾是否相同了
代码用到了一些c ++ 11的新姿势,auto太强了~
代码:
#include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define se second #define fs first #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define pii pair<int,int> const int INF = 1000000000; const int maxn = 10050; const int M = 4000; set< int > s[ 1050 ]; int T, n, k; char str[ 1050 ]; int dp[ 1050 ][ 30 ]; int main() { scanf( "%d", &T ); while( T -- ) { scanf( "%d", &k ); scanf( "%s", str + 1 ); int len = strlen( str + 1 ); n = len / k; for( int i = 1; i <= n; i ++ ) s[ i ].clear(); for( int i = 1; i <= n; i ++ ) for( int j = ( i - 1 ) * k + 1; j <= i * k; j ++ ) s[ i ]. insert( str[ j ] - ‘a‘ ); for( int i = 1; i <= n; i ++ ) for( int j = 0; j < 26; j ++ ) dp[ i ][ j ] = INF; for( auto i : s[ 1 ] ) dp[ 1 ][ i ] = s[ 1 ].size(); for( int i = 2 ; i <= n; i ++ ) { if( s[ i ].size() == 1 ) { for( auto j : s[ i ] ) for( auto k : s[ i - 1 ] ) { if( k == j ) dp[ i ][ j ] = min( dp[ i ][ j ], dp[ i - 1 ][ k ] ); else dp[ i ][ j ] = min( dp[ i ][ j ], dp[ i - 1 ][ k ] + 1 ); } } else { for( auto p : s[ i ] ) for( auto q : s[ i ] ) { if( p == q ) continue; for( auto k : s[ i - 1 ] ) { int siz = s[ i ].size(); if( q == k ) dp[ i ][ p ] = min( dp[ i ][ p ], dp[ i - 1 ][ k ] + siz - 1 ); else dp[ i ][ p ] = min( dp[ i ][ p ], dp[ i - 1 ][ k ] + siz ); } } } } int G = INF; for( auto i : s[ n ] ) G = min( G, dp[ n ][ i ] ); printf( "%d\n", G ); } return 0; }
UVA 11552 Fewest Flops
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。