HDU 2577

    技术2022-05-19  23

    http://acm.hdu.edu.cn/showproblem.php?pid=2577

    #include<iostream> using namespace std; #define N 101 int main(void) { char ch[N]; int dp_close[N],dp_open[N]; int t; scanf("%d",&t); while(t--) { scanf("%s",ch); int len=strlen(ch)-1; dp_open[0]=2; if(ch[0]>='a'&&ch[0]<='z') dp_close[0]=1; else dp_close[0]=2; for(int i=1;i<=len;i++) { if(ch[i]>='a'&&ch[i]<='z') { dp_open[i]=min(dp_open[i-1]+2,dp_close[i-1]+2); dp_close[i]=min(dp_close[i-1]+1,dp_open[i-1]+2); } else { dp_open[i]=min(dp_open[i-1]+1,dp_close[i-1]+2); dp_close[i]=min(dp_close[i-1]+2,dp_open[i-1]+2); } } printf("%d/n",min(dp_close[len],dp_open[len]+1)); } }  

    简单的DP,dp_close[]代表大写锁定关,dp_open[]代表大写锁定开。

    若当前字母为大写,DP方程为: dp_open[i]=min(dp_open[i-1]+1,dp_close[i-1]+2);

    dp_close[i]=min(dp_close[i-1]+2,dp_open[i-1]+2);

     

    若当前字母为小写,Dp方程为: dp_open[i]=min(dp_open[i-1]+2,dp_close[i-1]+2);

    dp_close[i]=min(dp_close[i-1]+1,dp_open[i-1]+2);


    最新回复(0)