【DP】good bye 2015 D

当时忽略了相等如果重复的话暴力判的话效率是n^3的,然后发现只要预处理一下lcp就好了。想问题还是会忽略细节啊。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
int f[5002][5002];
int n;
int lcp[5002][5002];
char s[100100];
int main()
{
    int start1,start2;
    char ch;
    bool flag;
    memset(f,0,sizeof(f));
    f[0][0]=1;
    scanf("%d ",&n);
    for (int i=1;i<=n;i++)
    	scanf("%c",&s[i]);
    for (int i=n;i;i--)
    	for (int j=i-1;j;j--)
    		lcp[i][j]=(s[i]==s[j]?lcp[i+1][j+1]+1:0);
    for (int i=1;i<=n;i++)
    	for (int j=1;j<=i;j++)
    	{
    		start1=i-j+1;
    		start2=i-2*j+1;
    		f[i][j]=f[i][j-1];
    		if (s[start1]=='0') continue;
    		if (start2<=0) f[i][j]=(f[i][j]+f[start1-1][start1-1])%1000000007;
    		if (s[start2]=='0') {f[i][j]=(f[i][j]+f[start1-1][j-1])%1000000007;continue;}
    		if (lcp[start1][start2]>=j) f[i][j]=(f[i][j]+f[start1-1][j-1])%1000000007;
    		else 
    		{
    			if (s[start1+lcp[start1][start2]]>s[start2+lcp[start1][start2]])
    				f[i][j]=(f[i][j]+f[start1-1][j])%1000000007;
    			else 
    				f[i][j]=(f[i][j]+f[start1-1][j-1])%1000000007;
			}
		}
    printf("%d",f[n][n]);
    return 0;
}

#include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_EQUIPMENT 100 #define NAME_LEN 50 #define MODEL_LEN 30 #define DATE_LEN 20 // 设备状态枚举 typedef enum Status { IDLE, IN_USE, UNDER_MAINTENANCE, SCRAPPED } Status; // 设备结构体 typedef struct Equipment { int id; // 设备编号 char name[NAME_LEN]; char model[MODEL_LEN]; float price; char purchase_date[DATE_LEN]; Status status; } Equipment; Equipment lab[MAX_EQUIPMENT]; // 设备数组 int count = 0; // 当前设备数量 // 函数声明 void add_equipment(); void display_all(); void search_by_id(); void modify_status(); void delete_by_id(); void init_sample_data(); const char* get_status_name(Status s); void clear_input_buffer(); int main() { int choice; // 初始化一些示例数据 init_sample_data(); do { // 打印菜单 printf("\n\n=== Laboratory Equipment Management System ===\n"); printf("1. Add Equipment\n"); printf("2. Display All Equipment\n"); printf("3. Search Equipment by ID\n"); printf("4. Modify Equipment Status\n"); printf("5. Delete Equipment\n"); printf("0. Exit\n"); printf("Please enter your choice: "); if (scanf("%d", &choice) != 1) { printf("Invalid input! Please enter a number.\n"); clear_input_buffer(); continue; } switch (choice) { case 1: add_equipment(); break; case 2: display_all(); break; case 3: search_by_id(); break; case 4: modify_status(); break; case 5: delete_by_id(); break; case 0: printf("Goodbye!\n"); break; default: printf("Invalid choice! Please try again.\n"); } } while (choice != 0); return 0; } // 清空输入缓冲区 void clear_input_buffer() { int c; while ((c = getchar()) != '\n' && c != EOF); } // 获取状态名称 const char* get_status_name(Status s) { switch(s) { case IDLE: return "Idle"; case IN_USE: return "In Use"; case UNDER_MAINTENANCE: return "Under Maintenance"; case SCRAPPED: return "Scrapped"; default: return "Unknown"; } } // 初始化示例数据 void init_sample_data() { // 添加一些示例设备 Equipment e1 = {1001, "Oscilloscope", "DSO-X 2002A", 8999.99, "2023-01-15", IDLE}; Equipment e2 = {1002, "Multimeter", "Fluke 87V", 2499.50, "2023-02-20", IN_USE}; Equipment e3 = {1003, "Power Supply", "DP832", 3200.00, "2023-03-10", UNDER_MAINTENANCE}; lab[count++] = e1; lab[count++] = e2; lab[count++] = e3; } // 添加设备 void add_equipment() { if (count >= MAX_EQUIPMENT) { printf("Error: The equipment list is full! Cannot add more equipment.\n"); return; } Equipment new_equip; int status_input; printf("\n--- Add New Equipment ---\n"); printf("Enter Equipment ID: "); if (scanf("%d", &new_equip.id) != 1) { printf("Invalid ID input!\n"); clear_input_buffer(); return; } clear_input_buffer(); // 检查ID是否已存在 for (int i = 0; i < count; i++) { if (lab[i].id == new_equip.id) { printf("Error: Equipment ID %d already exists!\n", new_equip.id); return; } } printf("Enter Equipment Name: "); fgets(new_equip.name, NAME_LEN, stdin); new_equip.name[strcspn(new_equip.name, "\n")] = '\0'; // 移除换行符 printf("Enter Equipment Model: "); fgets(new_equip.model, MODEL_LEN, stdin); new_equip.model[strcspn(new_equip.model, "\n")] = '\0'; printf("Enter Equipment Price: "); if (scanf("%f", &new_equip.price) != 1) { printf("Invalid price input!\n"); clear_input_buffer(); return; } clear_input_buffer(); printf("Enter Purchase Date (YYYY-MM-DD): "); fgets(new_equip.purchase_date, DATE_LEN, stdin); new_equip.purchase_date[strcspn(new_equip.purchase_date, "\n")] = '\0'; printf("Enter Status (0-Idle, 1-In Use, 2-Under Maintenance, 3-Scrapped): "); if (scanf("%d", &status_input) != 1 || status_input < 0 || status_input > 3) { printf("Invalid status input!\n"); clear_input_buffer(); return; } new_equip.status = (Status)status_input; lab[count] = new_equip; count++; printf("\nEquipment added successfully!\n"); } // 显示所有设备 void display_all() { if (count == 0) { printf("\nNo equipment found in the system.\n"); return; } printf("\n--- All Equipment List (%d items) ---\n", count); printf("=============================================================================================================\n"); printf("ID Name Model Price Purchase Date Status\n"); printf("=============================================================================================================\n"); for (int i = 0; i < count; i++) { printf("%-8d%-20s%-20s%-12.2f%-16s%-20s\n", lab[i].id, lab[i].name, lab[i].model, lab[i].price, lab[i].purchase_date, get_status_name(lab[i].status)); } printf("=============================================================================================================\n"); } // 根据ID查询设备 void search_by_id() { int search_id; if (count == 0) { printf("\nNo equipment found in the system.\n"); return; } printf("\nEnter Equipment ID to search: "); if (scanf("%d", &search_id) != 1) { printf("Invalid ID input!\n"); clear_input_buffer(); return; } for (int i = 0; i < count; i++) { if (lab[i].id == search_id) { printf("\n--- Equipment Found ---\n"); printf("ID: %d\n", lab[i].id); printf("Name: %s\n", lab[i].name); printf("Model: %s\n", lab[i].model); printf("Price: ¥%.2f\n", lab[i].price); printf("Purchase Date: %s\n", lab[i].purchase_date); printf("Status: %s\n", get_status_name(lab[i].status)); return; } } printf("\nEquipment with ID %d not found.\n", search_id); } // 修改设备状态 void modify_status() { int search_id, new_status; if (count == 0) { printf("\nNo equipment found in the system.\n"); return; } printf("\nEnter Equipment ID to modify status: "); if (scanf("%d", &search_id) != 1) { printf("Invalid ID input!\n"); clear_input_buffer(); return; } for (int i = 0; i < count; i++) { if (lab[i].id == search_id) { printf("\nCurrent Status: %s\n", get_status_name(lab[i].status)); printf("Enter New Status (0-Idle, 1-In Use, 2-Under Maintenance, 3-Scrapped): "); if (scanf("%d", &new_status) != 1 || new_status < 0 || new_status > 3) { printf("Invalid status input!\n"); clear_input_buffer(); return; } lab[i].status = (Status)new_status; printf("Status updated successfully to: %s\n", get_status_name(lab[i].status)); return; } } printf("\nEquipment with ID %d not found.\n", search_id); } // 删除设备 void delete_by_id() { int search_id; if (count == 0) { printf("\nNo equipment found in the system.\n"); return; } printf("\nEnter Equipment ID to delete: "); if (scanf("%d", &search_id) != 1) { printf("Invalid ID input!\n"); clear_input_buffer(); return; } for (int i = 0; i < count; i++) { if (lab[i].id == search_id) { // 显示要删除的设备信息 printf("\nDeleting Equipment:\n"); printf("ID: %d, Name: %s, Model: %s\n", lab[i].id, lab[i].name, lab[i].model); // 将最后一个元素移到当前位置,并减少计数 lab[i] = lab[count - 1]; count--; printf("Equipment deleted successfully!\n"); return; } } printf("\nEquipment with ID %d not found.\n", search_id); }函数clear_input_buffer的作用为什么要有它,没他会咋样
最新发布
09-23
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值