zoj 2915 hdu 2397 Dice Password Security

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=2915

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

题目的意思就是给定一些单词,可以用这些单词的任意组合作为密码。求一个密码长度为l,恰好由k个给定的单词组成的种数。

是个动态规划的题目,题目很好理解,用dp[i][j]表示由i个单词组成长度为j的密码的种数,则dp[i+1][j+k]=dp[i][j]*cnt[k](1<k<10)则本题就比较简单了。

因为单词个数最大为5即L,密码长度最大为50即LEN,单词长度最大为10即K,所以时间复杂度为O(L*LEN*K)。cnt【k】表示长度为k的单词总共由多少个。

代码:

#include <iostream> #include <cstdio> #include <string> #include <cstring> using namespace std; const int LEN=52; const int N=7; __int64 dp[N][LEN]; int cnt[11]; int main() { int t,m,n,q,i,k,j,l; scanf("%d",&t); string a; while (t--) { scanf("%d%d%d",&m,&n,&q); while (m--) { cin>>a; cnt[a.length()]++; } memset(dp,0,sizeof(dp)); for (i=1;i<=10;i++) { dp[1][i]=cnt[i]; dp[i][i]=cnt[1]; } for (i=0;i<5;i++) { for (k=0;k<=10;k++) { for (j=0;j<=LEN-k;j++) { dp[i+1][j+k]+=dp[i][j]*cnt[k]; } } } while (q--) { scanf("%d",&l); printf("%I64d\n",dp[n][l]); } } return 0; }

C# 中,事件Event)是用于实现发布-订阅模式的核心机制之一,广泛用于处理异步编程、用户界面交互以及组件通信等场景。事件允许一个对象在某些状态发生变化时通知其他对象,而无需知道这些对象的具体实现。 ### 事件的基本概念 事件是基于委托(Delegate)的封装。委托定义了事件的签名,即事件发生时调用的方法的参数和返回类型。事件可以被订阅(使用 `+=` 操作符),也可以被取消订阅(使用 `-=` 操作符)。 ### 定义和使用事件 以下是一个简单的 C# 事件示例: ```csharp using System; public class EventPublisher { // 定义一个委托 public delegate void NotifyEventHandler(string message); // 定义一个事件 public event NotifyEventHandler Notify; // 触发事件的方法 public void RaiseEvent(string message) { Notify?.Invoke(message); } } public class EventSubscriber { public void OnNotify(string message) { Console.WriteLine($"Received notification: {message}"); } } class Program { static void Main() { EventPublisher publisher = new EventPublisher(); EventSubscriber subscriber = new EventSubscriber(); // 订阅事件 publisher.Notify += subscriber.OnNotify; // 触发事件 publisher.RaiseEvent("Hello, World!"); } } ``` 在这个例子中,`EventPublisher` 类定义了一个名为 `Notify` 的事件,`EventSubscriber` 类包含一个方法 `OnNotify`,该方法被注册为事件的处理程序。当 `RaiseEvent` 方法被调用时,所有订阅该事件的方法都会被触发。 ### 多播事件处理 C#事件支持多播,即一个事件可以绑定多个处理方法。这些方法会按照它们被添加的顺序依次执行。 ```csharp publisher.Notify += subscriber.OnNotify; publisher.Notify += (message) => Console.WriteLine($"Another handler: {message}"); publisher.RaiseEvent("Multi-cast event"); ``` ### 使用 `EventHandler` 和 `EventArgs` 在实际开发中,通常使用 .NET 提供的 `EventHandler` 和 `EventArgs` 类来定义事件。`EventArgs` 可以携带事件发生时的附加信息。 ```csharp public class CustomEventArgs : EventArgs { public string Message { get; set; } } public class EventPublisher { public event EventHandler<CustomEventArgs> CustomEvent; public void RaiseCustomEvent() { CustomEvent?.Invoke(this, new CustomEventArgs { Message = "Custom event raised." }); } } class Program { static void Main() { EventPublisher publisher = new EventPublisher(); publisher.CustomEvent += (sender, e) => { Console.WriteLine($"Custom event received: {e.Message}"); }; publisher.RaiseCustomEvent(); } } ``` ### 事件与线程安全 在多线程环境中,事件的订阅和触发需要考虑线程安全。通常可以使用锁(`lock`)或 `Interlocked` 类来确保线程安全的操作。 ```csharp private object lockObj = new object(); public void SafeRaiseEvent(string message) { lock (lockObj) { Notify?.Invoke(message); } } ``` ### 事件在实际开发中的应用 事件广泛应用于 GUI 编程(如 WPF、WinForms)、异步编程(如 `async/await`)、以及各种组件之间的通信。例如,在 WPF 中,按钮点击事件是通过事件机制实现的: ```csharp button.Click += (sender, e) => { MessageBox.Show("Button clicked!"); }; ``` ### 相关问题 1. C# 中委托和事件的区别是什么? 2. 如何在 C# 中实现线程安全的事件处理? 3. C# 中如何使用 `EventHandler` 和 `EventArgs`? 4. C# 事件如何支持多播?如何控制事件处理的顺序? 5. 在 WPF 或 WinForms 中,事件是如何与 UI 交互的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值