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的初始化,我为啥总觉得不用初始化……

 

posted @ 2020-06-18 17:33  timeaftertime  阅读(260)  评论(0编辑  收藏  举报