目录
第三题的动态规划是区间dp[],酌情看,以后可能会整理,可以自己查一下知识点
1. 回文日期
import java.util.Scanner;
public class lll {
static int month[]= {0,31,28,31,30,31,30,31,31,30,31,30,31};
static boolean isrn(int y) {
if(y%100!=0&&y%4==0||y%400==0) return true;
return false;
}
static boolean check(int n) {
int y=n/10000;
int m=n/100%100;
int d=n%100;
if(m==0||m>12)return false;
if(isrn(y)) {month[2]=29;}
else {month[2]=28;}
if(d==0||d>month[m])return false;
return true;
}
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int date1=in.nextInt();
int date2=in.nextInt();
//制作回文数字
long sum=0;
for(int i=0;i<10000;i++){
int x1=i;//放前四位
int x2=i;//放后四位
for(int j=0;j<4;j++) {
x1=x1*10+x2%10;
x2/=10;
}//i=9999 x1=x2=9999
//j:0 x1=99999 x2=999 1:x1=999999 x2=99 2:x1=9999999 x2=9 3:x1=99999999 x2=0;
if(x1>=date1&&x1<=date2&&check(x1)) {
sum++;
}
}
System.out.println(sum);
}
}
2. 回文日期
//破系统,太垃圾了,同一段代码跑了5遍,前面一直超时,最后一次过了???
import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
static int x=0,y=0;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int data = sc.nextInt();
for (int i = data+1; i <= 99999999&&y==0; i++) {
String str = i + "";
int i1=(str.charAt(4)-'0')*10 + str.charAt(5)-'0',i2 = (str.charAt(6)-'0')*10 + str.charAt(7)-'0';
if (i1 > 12 || i2 > 31 || i1 == 0 || i2 == 0)
continue;
char[] ch = str.toCharArray();
huiwenriqi(ch);
}
sc.close();
}
public static void huiwenriqi(char[]ch) {
char a = ch[0], b = ch[1], c = ch[2], d = ch[3],e = ch[4],f = ch[5],g = ch[6],h = ch[7];
if(a==h&&b==g&&c==f&&d==e&&x==0) {
System.out.println(ch);x=1;
}
if(a==c&&c==f&&f==h&&b==d&&d==e&&e==g) {
System.out.println(ch);y=1;
}
}
}
3.判定回文串
import java.util.Scanner;
//1:无需package
//2: 类名必须Main, 不可修改
public class mmm {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n=in.nextInt();//字符串的长度
int q=in.nextInt();//查询数
String s=in.next();
s=" "+s;//字符串索引从 11 开始
int dp[][]=new int[n+10][n+10];
int r=0;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
dp[i][j]=0;
}
}
for(int i=1;i<=n;i++) {
dp[i][i]=1;
}
for(int len=2;len<=n;len++) {
for(int l=1;l+len-1<=n;l++) {
r=l+len-1;
//防止dp继续缩小至为负区间
if(len==2&&s.charAt(l)==s.charAt(r)) {
dp[l][r]=1;
continue;
}
if(s.charAt(l)==s.charAt(r)) {//如果是回文
dp[l][r]=dp[l+1][r-1];
}
}
}
while(q-->0) {
int l1=in.nextInt();
int r1=in.nextInt();
if(dp[l1][r1]==1) {
System.out.println("Yes");
}else {
System.out.println("No");
}
}
}
}