洛谷 1220 关路灯
一道典型的区间dp题
我一开始做的时候,忘记了之前是怎么写这道题的了
于是翻开之前的代码
回忆起了这题的大致思路
dp[i][j][0/1]
表示i~j区间,0表示老张现在正在区间的i端,1表示老张正在区间的j端
我们想一下怎么转移
肯定是由i+1,j或者i,j-1转移过来的
那么我们只要计算一下除了i+1,j区间之外的还亮着的耗能,和i,j-1区间之外的还亮着的耗能
这个计算很简单,只需要计算一下前缀和就可以算出来了
我们看看代码
1 #include <cstdio>//0在i,1在j 2 #include <cstdlib> 3 #include <iostream> 4 #include <algorithm> 5 #include <cstring> 6 #include <iostream> 7 using namespace std; 8 const int N=1000; 9 int sum[N],p[N],d[N],n,c,dp[N][N][2]; 10 int calc(int a,int b,int i,int j) 11 { 12 return (p[b]-p[a])*(sum[i]+sum[n]-sum[j]); 13 } 14 int main() 15 { 16 scanf("%d %d",&n,&c); 17 for(int i=1;i<=n;i++) 18 { 19 scanf("%d %d",&p[i],&d[i]); 20 sum[i]=sum[i-1]+d[i]; 21 } 22 memset(dp,0x3f,sizeof(dp)); 23 dp[c][c][0]=dp[c][c][1]=0; 24 for(int i=c;i<=n;i++) 25 { 26 for(int j=i-1;j>=1;j--) 27 { 28 dp[j][i][0]=min(dp[j+1][i][1]+calc(j,i,j,i),dp[j+1][i][0]+calc(j,j+1,j,i)); 29 dp[j][i][1]=min(dp[j][i-1][0]+calc(j,i,j-1,i-1),dp[j][i-1][1]+calc(i-1,i,j-1,i-1)); 30 } 31 } 32 printf("%d\n",min(dp[1][n][0],dp[1][n][1])); 33 return 0; 34 }
一开始不要忘记赋初始值0
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率
· AI Agent爆火后,MCP协议为什么如此重要!