12B:要变多少次
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 int t; 5 string s; 6 int d[1005]; 7 int main(){ 8 cin>>t; 9 while(t--){ 10 cin>>s; 11 //00101101 12 memset(d,0,sizeof(d)); 13 int len = s.length(); 14 for(int i = 1; i <= len; i++) d[i] = 1; 15 for(int i = 1; i <= len; i++){ 16 for(int j = 1; j < i; j++){ 17 if(s[i-1]>=s[j-1]) d[i] = max(d[i], d[j]+1); 18 } 19 //cout<<d[i]<<" "; 20 } 21 int ans = 0; 22 for(int i = 1; i <= len; i++) 23 ans = max(ans, d[i]); 24 cout<<len-ans<<endl; 25 } 26 return 0; 27 }
备注:我太菜了。上一道题披马甲我还能看出来,这道最长上升(不下降)子序列披马甲我就看不出来了,最开始也想错了。这道题的上升序列就是0001111,00000,1111111,这种形式。然后序列之外的数就都需要修改,所以答案是len-序列长度。这个马甲好巧妙。
要注意d的初始化,我为啥总觉得不用初始化……