百度笔试 长度为k 且和为偶数的字符列有多少个?
public class Main {
private int mod = 10 ^ 9 + 7 ;
public int fun ( int [ ] nums , int k) {
int length = nums. length;
int [ ] [ ] [ ] dp = new int [ length] [ k+ 1 ] [ 2 ] ;
if ( nums[ 0 ] % 2 == 0 ) {
dp[ 0 ] [ 1 ] [ 0 ] = 1 ;
} else {
dp[ 0 ] [ 1 ] [ 1 ] = 1 ;
}
for ( int i= 1 ; i< length; i++ ) {
for ( int j= 1 ; j<= i+ 1 && j<= k; j++ ) {
if ( j== 1 ) {
if ( nums[ i] % 2 == 0 ) {
dp[ i] [ j] [ 0 ] = dp[ i- 1 ] [ 1 ] [ 0 ] + 1 ;
dp[ i] [ j] [ 1 ] = dp[ i- 1 ] [ 1 ] [ 1 ] ;
} else {
dp[ i] [ j] [ 0 ] = dp[ i- 1 ] [ 1 ] [ 0 ] ;
dp[ i] [ j] [ 1 ] = dp[ i- 1 ] [ 1 ] [ 1 ] + 1 ;
}
} else {
if ( nums[ i] % 2 == 0 ) {
dp[ i] [ j] [ 0 ] = dp[ i- 1 ] [ j] [ 0 ] + dp[ i- 1 ] [ j- 1 ] [ 0 ] ;
dp[ i] [ j] [ 1 ] = dp[ i- 1 ] [ j] [ 1 ] + dp[ i- 1 ] [ j- 1 ] [ 1 ] ;
} else {
dp[ i] [ j] [ 0 ] = dp[ i- 1 ] [ j] [ 0 ] + dp[ i- 1 ] [ j- 1 ] [ 1 ] ;
dp[ i] [ j] [ 1 ] = dp[ i- 1 ] [ j] [ 1 ] + dp[ i- 1 ] [ j- 1 ] [ 0 ] ;
}
}
dp[ i] [ j] [ 0 ] = dp[ i] [ j] [ 0 ] % mod;
dp[ i] [ j] [ 1 ] = dp[ i] [ j] [ 1 ] % mod;
}
}
return dp[ length- 1 ] [ k] [ 0 ] ;
}
public static void main ( String [ ] args) {
int [ ] arr = new int [ ] { 1 , 2 , 3 } ;
System . out. println ( new Main ( ) . fun ( arr, 1 ) ) ;
}
}