这道题比较特殊,答案不是dp数组的某个值,而是记录下来的一个变量
主要思路是二维DP数组,用i、j存储两个下标,如果input[i] = input[j]&&dp[i - 1][j - 1]==1 那么 dp[i][j] = 1 ,然后初始化dp[i][i]就行了
patzjujztaccbcc

代码

  1. #include<algorithm>
  2. #include<stdio.h>
  3. #include<cstring>
  4. #include<iostream>
  5. using namespace std;
  6. const int maxn = 1010;
  7. int dp[maxn][maxn]={0};
  8. char input[maxn];
  9. int main(){
  10. scanf("%s", input);
  11. int len = strlen(input), ans = 1;
  12. for(int i = 0; i < len; i++){
  13. dp[i][i] = 1;
  14. if(i < len - 1){
  15. if(input[i] == input[i + 1]){
  16. dp[i][i + 1] = 1;
  17. ans = 2;
  18. }
  19. }
  20. }
  21. //一定要把1和2先处理掉,从3开始
  22. for(int L = 3; L <= len; L++){//长度为1和2的都已经被处理了
  23. for(int i = 0; i + L - 1 < len; i++){
  24. int j = i + L -1;
  25. if((input[i] == input[j]) && (dp[i + 1][j - 1] == 1)){
  26. dp[i][j] = 1;
  27. ans = L;
  28. }
  29. }
  30. }
  31. printf("%d", ans);
  32. return 0;
  33. }